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

VC++
在类VC的界面实现中加入目录树
软件换肤技术在 BCB 中的实现
利用非模窗口生成MDI介面
报表输出轻松搞定
Windows 中不规则窗体的编程实现
解说Win32的窗口子类化
使用测试优先方法开发用户界面
一个简单的登录对话框的实现
一个简单的日记本程序
从资源中加载皮肤
一个在RichEdit中添加表情图象的类
ActiveSkin 4.3 软件换肤在VC中的实现
一种另类“关于(About)”对话框的动态显示方法
对话框打印预览及打印
关于如何换肤、子类化的解决方案
制作 MSN、QQ 的消息提示窗口
如何对 BCGControlBarPro 进行换肤
定制个性化的对话框窗口类
改变窗口中的光标形状
更新MFC中的视图,跟踪.NET Framework中的事件

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 56 ::
收藏到网摘: 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 (空串)
可以根据这个产生式构造递归的语法分析器。具体细节就不叙述了,可以阅读源代码。

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