简单的表达式求值

王朝vc·作者佚名  2006-01-17
宽屏版  字体: |||超大  

简单的表达式求值

作者/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 (空串)

可以根据这个产生式构造递归的语法分析器。具体细节就不叙述了,可以阅读源代码。

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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
© 2005- 王朝网络 版权所有