如何分析代数表达式

时间:2010-11-21 05:42:27

标签: php parsing infix-notation

我打算制作一个可以分析代数表达式的程序 例如:
<?php echo cal ('5*5+2*2'); ?>
我的程序会知道它会将5乘以2和2乘以2然后加上它们。我想自己分析一下,而不是用php。

2 个答案:

答案 0 :(得分:1)

我打算建议你看看recursive descent parsers,但显然自从我上次在20世纪80年代中期这样做以来,事情已经发生了变化。如果您想要了解其背后的理论,那么Parsing Expression Grammar似乎是现在的方法。

如果你对这个理论不太关心,那就没问题了:实现理论意味着你最终还是会编写一个递归下降解析器,所以你可以这样做: - )

答案 1 :(得分:0)

您可以使用'中缀'表达式并使用堆栈,将其转换为'前缀'或'后缀'表达式以确定操作顺序(括号,指数,乘法或除法,加法或减法)。

例如表达式([5] [*] [5] [+] [2] [*] [2])将被转换为后缀表达式[5] [5] [*] [2] [ 2] [*] [+]。这个'后缀'表达式现在可以读作'五和五乘以,两和二乘,然后加在一起',这将保留操作的顺序。

另一种思考'前缀/后缀'思想的方法是多个堆栈。遇到数字5时,将其推入主堆栈。遇到乘法符号时,将其存储在辅助堆栈中。当你到达下一个5时,将它推到主堆栈上,然后将所有项目从你的辅助堆栈中弹出并将它们推到主堆栈上。

一旦你有了正确的操作符和操作数,就可以将这些项目从堆栈中弹出然后进行评估。

我记得在大学的计算机科学102课程中弄清楚这个问题。你这样做是为了好玩,还是只想弄明白?