自己开发计算器(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)

下面看看源代码。先从使用的地方看起。

 

  1. QList<Token*> CalculateEngine::analyzeToken(QString strQuestion)  
  2. {  
  3.     typedef TokenAnalyzer<Token, Token::EType, QList<Token*>::iterator> MyAnalyzer;  
  4.  
  5.     class MyFactory : public MyAnalyzer::TokenPatternFactory  
  6.     {  
  7.         virtual int createPatterns(QList<MyAnalyzer::TokenPattern*>& list) 

      相关新闻>>

      发表评论
      请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
      用户名: 验证码:点击我更换图片
      最新评论 更多>>

      推荐热点

      • Android 完全退出程序
      • 原创:Android应用开发-Andorid歌词秀,含源码
      • android 屏幕保护
      • Android手机软件汉化教程---第四课 dex文件汉化
      • 众多Android 开源项目推荐,给力工作给力学习
      • Android Audio代码分析4
      • Android得到已安装的应用程序信息!
      • Android开发者指南(29) —— USB Host and Accessory
      • Android成长的幕后推手:工程师鲁宾
      网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
      Copyright © 2008-2015 计算机技术学习交流网. 版权所有

      豫ICP备11007008号-1