自己开发计算器(3)-140行代码搞定Token解析
来源:西尖山笔记 责任编辑:栏目编辑 发表时间:2013-07-01 11:47 点击:次
解析算式也好,脚本也罢,在分析语法之前,一般都会引入词法分析的过程。简单说比如我们有如下算式
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]+" |
这样一来我们就可以象处理+/-号一样处理其他要素了。正则表达式的语法大家可以参照【精通正则表达式(第3版) 】一书。至于实际的内容建议大家看一下另一篇文章:
自己开发计算器(0)-扩展巴科斯范式(EBNF)
下面看看源代码。先从使用的地方看起。
- QList<Token*> CalculateEngine::analyzeToken(QString strQuestion)
- {
- typedef TokenAnalyzer<Token, Token::EType, QList<Token*>::iterator> MyAnalyzer;
- class MyFactory : public MyAnalyzer::TokenPatternFactory
- {
- virtual int createPatterns(QList<MyAnalyzer::TokenPattern*>& list)
相关新闻>>
最新推荐更多>>>
- 发表评论
-
- 最新评论 更多>>