简单的表达式求值

2016-01-29 12:15 30 1 收藏

简单的表达式求值,简单的表达式求值

【 tulaoshi.com - C语言心得技巧 】

简单的表达式求值


作者/ZF.Yi

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com)

下载源代码


一直很想做个比 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 (空串)
可以根据这个产生式构造递归的语法分析器。具体细节就不叙述了,可以阅读源代码。

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

来源:https://www.tulaoshi.com/n/20160129/1485237.html

延伸阅读
标签: Web开发
正则表达式在PHP中被用来处理复杂的文字串。支持正则表达式的函数有: ereg()ereg replace()eregi replace()split() 这些函数都将正则表达式作为他们的第一个参数。PHP使用POSIX扩展规则表达式(使用POSIX 1003.2)。要找到所有的关于POSIX扩展规则表达式的描述,请查看包括在PHP发行版本之内的regex man页面。 Examp...
正则表达式简介 翻译:NorthTibet 原文出处:Regular Expressions 有些新手对正则表达式不是很熟悉,有必要在此作一简单回顾。如果你是正则表达式高手,可以不用看这一部分。 正则表达式是描述字符串集的字符串。例如,正则表达式“Mic*”描述所有包含“Mic”,后跟零个或多个字符的字符串。Mickey、Microsoft、Michelangelo...
标签: Web开发
####################### #作者:雨浪 版权所有,翻版说一下 # #QQ:270499458 # ####################### 近段日子几个刚学了正则表达式的朋友问我在asp中怎么用.呵呵.虽然简单,还是写出来吧,正则表达式的基本知识我就不说了.其实已经有...
标签: Web开发
前言 正则表达式是烦琐的,但是强大的,学会之后的应用会让你除了提高效率外,会给你带来绝对的成就感。只要认真去阅读这些资料,加上应用的时候进行一定的参考,掌握正则表达式不是问题。 索引 1. 引子 目前,正则表达式已经在很多软件中得到广泛的应用,包括*nix(Linux, Unix等),HP等操作系统,PHP,C#,Java等开发环境,以...
与/或表达式化简 作者:袁国桃 (西安理工大学 计算机学院) 源代码下载 我在VCKBASE里面混了已有两年多的时间了。在这期间我看到了许多优秀了技术文档,我从中受益非浅。一直想为她写些什么,但总是感到心有余而力不足。现在我已经是大四学生,还有十几天就要离开校园了。在这大学的最后时刻,我决定为V...

经验教程

197

收藏

78
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部