0

评估表达式的正确语法是什么?

public double evaluate(){
    String ans = (expressionOne.getValue())+""+(SignOperator.getName())+""+expressionTwo.getValue()+"";

    return Double.parseDouble(ans);
}

例如 expressionOne 可以是 X,其值为 5.5,而 expressionTwo 例如可以是 Y,其值为 9.0。当我试图评估某个表达式时,我得到:
线程“main”中的异常 java.lang.NumberFormatException:对于输入字符串:“5.5+9.0”

第二部分是当我想打印我创建的一些表达式时 toString()

public String toString() {
    String ans = expressionOne.toString()+""+SignOperator.getName()+""+expressionTwo.toString()+"";
    return ans;
}

例如:

    Variable x = new Variable ('x',5.5);
    Variable y = new Variable ('y', 3.5);
    Constant  nine= new Constant (9.0);
    Operator plus=new Operator('+');


    BinaryExpression xPy = new BinaryExpression(x, plus, y);
    BinaryExpression xP9 = new BinaryExpression(x, plus,nine);

当我打印 xPy 时会给我 x+y。当我打印 xP9 - 它会给我 x+9 (因为九是恒定的)。
我如何在一个 toString 中检查表达式是常量(只是一个数字)还是一个变量(如示例中) - 如何检测它?.

编辑
如您所见,有两种 BinaryExpression - 其中一种 xPy - x 和 y 是两个变量,如果我想评估它们,它会给我例如( 3.0+5.0 )但如果我将打印它们它将给我 x+y,对于第二个示例 xP9 - 如果我将评估它将给我 (3.0+9.0) 但如果我将打印它们它将给我 (x + 9.0) 因为九是常数(见问题) .

谢谢。

4

4 回答 4

0

对于评估,您需要评估自己,Double.parseDouble()不会为您评估表达式然后返回结果

Double.parseDouble()接受一个可表示为双精度的字符串(您知道“1223.456”确实是一个双精度值,它是字符串形式,而“123.45+153.4”不是因为它包含使其无效的双精度值的“+”字符)

我如何在一个 toString 中检查表达式是常量(只是一个数字)还是一个变量

您可以使用Character.isDigit()方法知道表达式是数字(数字)还是变量(非数字)

请参阅Character类 API 文档

于 2013-01-03T09:03:26.587 回答
0

为什么要创建一个字符串来描述 evaluate() 中的操作?你应该在那里对双打进行操作。

我建议在类 Operator 中添加一个方法:

double apply(double left, double right) 

具有适当的实现类。

Operator plus = new Operator('+')
{
    double apply(double left, double right) { return left + right; }
};

然后,您只需在评估方法中调用 apply

于 2013-01-03T09:08:23.633 回答
0

我希望这可以帮助您在哪里尝试评估整个表达式并为您提供结果。

我了解您正在尝试编写一个表达式评估器引擎​​,您可以在其中使用下面帖子中使用的脚本引擎。

使用脚本引擎评估字符串表达式

于 2013-01-03T09:11:50.753 回答
-1

如果您想制作算术评估器,请查看infix和符号。postfix例如:

在修复符号中:

y = 4 + 9 + 3 / 6 * 5;

后修复符号:

y = 4 9 3 6 / 5 * + +;

参考 http://scriptasylum.com/tutorials/infix_postfix/algorithms/infix-postfix/index.htm

于 2013-01-03T09:09:54.063 回答