解析算式也好,脚本也罢,在分析语法之前,一般都会引入词法分析的过程。简单说比如我们有如下算式
acosd(2)+cosd(30)*12+1.23E-21为了处理简单,在真正计算之前都会先将输入分解成一个个的单词(Token)。比如上面的内容经过处理,如果能变成下面的形式,就容易处理了。
acosd,(,2,),+,cosd,(,30,),*,12+1.23E-21这里,类似于acosd,cosd和(,),*之类的要素可以通过简单的字符串比较来解决。但是数字还有最后e指数就没有那么简单了。当然如果你认为这正好是展现编程基本功的机会的话,没有人拦着你,但是在本软件中我们采用了正则表达式来解决这个问题。
例如e指数可以如下定义:
"((\\.[0-9]+)|([0-9]+(\\.[0-9]*)?))[eE][+-]?[0-9]+"对于一般形式的小数:
"(\\.[0-9]+)|([0-9]+\\.[0-9]*)"整数就更简单了。
"[0-9]+"这样一来我们就可以象处理+/-号一样处理其他要素了。可以很明显的看出,这里的内容和EBNF的内容很相似,也不知道是谁跟谁学的。
表达式解析
表达式解析的程序结果基本上就是参照EBNF的内容在加上一些归纳。主要功能有:
1.表达式解析通过buildExpr实现
2.表达式计算通过evaluate实现。
这里只提供类图,详细可以参照代码。