查看: 70|回复: 1

简单的表达式求值

[复制链接]
发表于 2016-10-18 11:30:35 | 显示全部楼层 |阅读模式 来自 甘肃
一直很想做个比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 (空串)
可以根据这个产生式构造递归的语法分析器。具体细节就不叙述了,可以阅读源代码。
语法分析正确后就可以求值了,求值时用到一个操作数堆栈和操作符堆栈,以及一个算符优先表(存储了运算符之间的优先关系),具体细节可以阅读源码。
本文配套源码
卓航论坛免责声明
Discuz X 最新常见问题解决方案 https://bbs.piaoxian.net/thread-77402-1-1.html (出处: 飘仙建站论坛)
回复

使用道具 举报

发表于 2016-10-19 22:56:17 | 显示全部楼层 来自 印度
过来看看的
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注公众号

相关侵权、举报、投诉及建议等,请发 E-mail:admin@discuz.vip

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖
关注公众号
QQ客服返回顶部