解析数学表达式会产生错误的树

时间:2016-06-16 00:22:06

标签: java recursion syntax tree

所以代码相当复杂,所以不好尝试做一些覆盖最重要问题的简洁伪代码。我正在尝试解析数学表达式。例如:1-5 *( - 2)+3 = 14

我使用的语法是:

expression = term   OR term+expression OR term-expression
term       = factor OR factor*term     OR factor/term
factor     = number OR -factor         OR (expression)

我编写了一段代码,用于检查表达式是否遵循此语法,它可以很好地检查表达式,但不能用于计算表达式。

伪代码类似于:

double readExpression()
    number = readTerm()
    if token == +
        number2 = readExpression()
        return number + number2
    else if token == -
        number2 = readExpression()
        return number - number2
    else
        return number
...
(The code for readTerm() is identical to readExpression() in structure)
...
double readFactor()
    if token == number
        return number
    else if token == -
        number = readFactor()
        return (-1)*number
    else if token == (
        number = readExpression()
        return number
    else raise exception

如果我使用此代码进行上述计算,它将为我提供一个如下所示的树:

所以,无论如何,正如你现在已经想到的那样,当你的问题时,表达式应该给出14而不是8。我注意到,当表达式前面有减号时会出现问题,因为影响整个正确的术语我这个问题虽然它们应该只影响中期。

我一直想疯了几个星期,并考虑解决方案,并查看其他代码,等等。如果我们在树遍历和其他相关主题上一直在浏览我自己并不是非常简单和好的话,请不要在我身上扔掉一堆链接。

在这个阶段我该怎么办?正如我所说,我的程序可以判断它是对还是错。所以现在我只需要解析一个正确的表达式。我应该编写另一个类来解析正确的表达式吗?它更容易吗?无论如何,我不知道代码看起来会有什么不同。

1 个答案:

答案 0 :(得分:0)

是的,我会解析这个等式,它看起来好像你错过了操作/解析顺序的关键部分。您需要额外检查双重否定。

这里的关键因素是:在有两个相同操作符的情况下,最左边的操作总是先执行。

首先让我们缩小范围。

1-5*(-2)+3等于1--10+3

现在,出于我们的目的,我们可以为第一个运算符指定一个正数,因为它有助于说明一点:

1--10+3+1--10+3

相同

现在,如果我们通过正确的解析器运行+1--10+3,我们就会知道此--等于+但仅在以下情况下使用时

+X--Y = X+Y

现在我们的解析器已将1--10+3的原始表达式转换为1+10+3,我们知道它等于14。

所以全部:是的,你需要一个解析器,但要特别注意+ X - Y和X + Y是如何工作的。

另请看一下这个答案:https://stackoverflow.com/a/26227947/1270000