当前位置: 首页 > 图文教程 > 开发语言 > VC++ > 简单的表达式求值

VC++
在Dialog中使用Menu和Toolbar
如何定制对话框中的回车键
再谈 Windows 2000 “打开”文件对话框
Windows2000新型Open对话框的使用
Windows SDK 非模态对话框的消息处理
VC6中使用CHtmlView在对话框控制中显示HTML文件
Windows 2000 UI 新特点之四:其他类型的外壳扩展
Windows 2000 UI 新特点之二:自定义文件夹栏目
Windows 2000 UI 新特点之三:搜索管理器
Windows 2000 UI 新特点之一:信息条提示(Infotip)
数据库异步操作(ADODB)
VC++:小编谈自动注册数据源(DSN)
VC++:小编分享面向对象特征及其优点
VC++:VC++中Windows 3.x的协同多任务
VC++:小编浅谈VC++中的CRecordset类
VC++:小编浅谈ODBC概念,了解ODBC不在是难事
VC++:小编谈用ODBC创建表
VC++:小编浅谈用DAO创建表
VC++:浅析VC++中传统控件的控件通知消息
VC++:小编浅谈静态控件

VC++ 中的 简单的表达式求值


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 44 ::
收藏到网摘: n/a

简单的表达式求值


作者/ZF.Yi

下载源代码


一直很想做个比 Windows 自带的高级一点的计算器,能将整个表达式输入,然后求值。这个程序要求读者具备编译原理的一些知识。举个实例来说明程序处理过程。假设要求值的表达式为 :

 -25*(56+15)# (其中#号作为表达式结束标志)。 
首先对表达式进行词法分析,允许出现的字符为:
 {0 ,1, 2 ,3 ,4 ,5 ,6, 7 ,8, 9 . ,+ ,-, *, / ,( ,),#} 
分析的结果产生两种类型的单词:操作符和操作数。

操作符包括:
 {+, - ,* ,/ ,( ,)} 
操作数包括:
 int 和 double 类型。 
上面表达式产生的单词序列为:
 {-25,*,(,56,+,15,)}。 
这些单词的类型也需要保存。

词法分析正确后将对产生的单词序列进行语法分析。

定义E为表达式,N为常数(视为终结符)。表达式的产生式可表示如下:
 E ' N E ' (E) E ' E+E E ' E-E E ' E*E E ' E/E
消除左递归后的产生式(E_为新产生的符号):
 E->NE_ E->(E)E_ E_->+EE_ E_->-EE_ E_->*EE_ E_->/EE_ E_->NULL (空串)
可以根据这个产生式构造递归的语法分析器。具体细节就不叙述了,可以阅读源代码。

语法分析正确后就可以求值了,求值时用到一个操作数堆栈和操作符堆栈,以及一个算符优先表(存储了运算符之间的优先关系),具体细节可以阅读源码。