使用Qt和Interpreter设计模式开发计算器(附源码)(2)

解析算式也好,脚本也罢,在分析语法之前,一般都会引入词法分析的过程。简单说比如我们有如下算式 

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实现。

这里只提供类图,详细可以参照代码。 

使用Qt和Interpreter设计模式开发计算器(附源码)

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wypgjx.html