【发布时间】:2015-05-15 07:31:03
【问题描述】:
我目前正在实现我自己的数学解析器 - 我对如何进行有几个问题。
到目前为止,我的解析器正在将输入字符串转换为令牌:
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();
}
还有一个类似的函数哈希表。
现在,Token 类扩展了 MathCommand - Token 可以返回其类型的函数或运算符。缺点是 Token 返回一个对象,而不是运算符或函数。运算符和函数中的方法之间的区别显然不大。
操作符有方法:
getValue(String number1, String number2);
一个函数有方法:
getValue(String number);
我能否以某种方式实现一个接口并将方法 getValue 重写为上述方法之一?
【问题讨论】:
-
算子、加法、...是你自己的类吗?你只想实现一个接口?
-
对不起,它们是我自己的课。运算符是加法、减法等的超类。我将在帖子中进行编辑。
-
你考虑过使用varargs吗?