2015-05-15 44 views
1

我目前正在實現我自己的數學解析器 - 並且我有幾個關於如何繼續的問題。數學解析器 - 令牌結構

到目前爲止,我的解析器將輸入字符串轉換成令牌:

public class Token 
{ 
    final public String expression; 
    final public int value; 

    public Token(String expression, int value) 
    { 
     this.expression = expression; 
     this.value = value; 
    } 
} 

每個字符串,表達,是一個有效項 - 數,運算符或函數。 Integer類型被傳遞給一個枚舉來標識該標記。

當輸入字符串被分成標記時,表達式將用Shunting-yard算法進行分析。

我的問題:我想令牌創建它們類型的對象。這樣做的一種方法可能是:

public abstract class MathCommand 
    { 

    final static Hashtable<Character, Operator> operatorTable = new Hashtable<Character, Operator>() 
    {{  

      put('+', new Addition()); 
      put('-', new Subtraction()); 
      put('/', new Division()); 
      put('*', new Multiplication()); 

    }}; 

    public abstract Object getMathCommand(); 

    } 

和一個類似的Hashtable函數。

現在,類Token擴展了MathCommand - 並且Token可以返回其類型的函數或操作符。缺點是Token返回一個Object,而不是一個Operator或一個Function。運算符和函數中方法的區別顯然不大。

某運營商的方法:

getValue(String number1, String number2); 

和一個函數有方法:

getValue(String number); 

我可以以某種方式實現一個接口,並覆蓋方法GetValue是上述之一?

+0

是運營商,加...自己的類?你只是想實現一個接口? – Dien

+0

對不起,他們是我自己的班級。運算符是加法,減法等的超類。我將在後文中對其進行編輯。 –

+2

你有沒有考慮過使用[varargs](https://docs.oracle.com/javase/tutorial/java/javaOO/arguments.html)? – kaykay

回答

0

他們可能有一個共同的接口:

interface Callable { 
    int getNumberOfArguments(); 
    String getValue(String[] args); 
} 
+0

謝謝 - 我做了這個和@kaykay的評論的結合。 –