从今天开始,我要发表些一系列文章。讨论关于如何编程实现加减乘除四则运算的解析和计算。我现在所掌握的一共有三种方法。
第一种方法称为递归下降。通过调用一些相互递归的函数来解析表达式。不需要任何前提知识。
第二种方法首先建立抽象语法树,然后再遍历语法树,把中缀表达式变成后缀表达式,然后再计算。需要一点编译原理的知识。
第三种方法首先建立抽象语法树,然后直接遍历语法树计算出结果。需要更多的编译原理知识。
这篇文章讨论第一种方法。这种方法经常出现在编程语言和数据结构的教科书书中,来展现递归的神奇作用。首先,一个表达式由一些通过加和减运算的项组成。项再由一些通过乘和除法运算的因子组成。然后因子可以由数字组成。下来的问题是如何识别表达式,项,因子和数字。可以为表达式定义一个expression()方法来解析,为项定义一个term()方法来解析,为因子定义一个factor()方法来解析,数字直接根据输入的符号来解析。最顶层的expression()方法不断地调用term()来解析项,term()方法再不断地调用factor()来解析因子,在factor()方法中不断地根据输入符号来解析数字。
所以递归下降的方法就是通过对表达式不断地细分,求值再通过计算把结果进行结合。
expression()方法可以由下面的图所描述:
很容易转换为代码:
term()可以由下面的图所描述:
转换为代码:
factor()可以由下面的图所描述:
转换为代码:
完成了!下面是完整的java源代码: