【发布时间】:2016-06-16 00:22:05
【问题描述】:
所以代码相当复杂,所以我试着做一些简洁的伪代码来涵盖最重要的问题。我正在尝试解析数学表达式。例如: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。我注意到当表达式前面有减号时会出现问题,因为会影响整个右项我这个问题,而他们应该只影响中间项。
我已经疯狂地思考了好几个星期,并为此考虑了解决方案,并查看了其他代码等等。如果我自己浏览了很多关于树遍历和其他相关主题的链接,请不要向我扔一堆链接。
在这个阶段我能做什么?正如我所说,我的程序可以判断它是对还是错。所以现在我只需要解析一个正确的表达式。我应该写另一个类来解析正确的表达式吗?更容易吗?无论如何,我看不出该代码与此有何不同。
【问题讨论】:
标签: java recursion syntax tree