下载实例:http://www.wisdomdd.cn/Wisdom/resource/articleDetail.htm?resourceId=1074

程序主要包括:基础结构定义、词法分析、语法分析、算术运算

基础结构定义:枚举(操作数类型、操作符类型、标记类型、有限状态自动机);

结构(操作数、操作符、标记、标记链)。

词法分析:将字符串分解成有效标记(有效的操作数和操作符),生成标记链表。

语法分析:分析括弧的有效性,操作数、操作符的排列有效性,操作符与操作数类型匹配关系。

算术运算:使用后缀表达式运算规则,根据后缀表达式链表进行求值。首先将我们日常应用的中缀表达式转换为后缀表达式。例如:6*(5-3) 转换为 6 5 3 - *,6-2+5*2转换为 6 2 - 5 2 * +

这里对后缀表达式的转换作一个说明,每个操作符有一个运算优先级(oper_PRI),但是当表达式中含有括弧时,括弧中的操作符运算优先级会改变。所以增设了一个括弧深度优先级(deep_PRI)。采用两个优先级的方式比使用栈显得简单易读。

操作符 oper_PRI
+ 7
- 7
* 9

在转换时,操作符拥有两个优先级,表示为:操作符(deep_PRI,oper_PRI)

依次输入表达式 5+(8-2*3)*4 的各个标记 最后输出5 8 2 3 * - 4 * +。

输入 临时空间

输入操作符时,放入临时空

间,同时触发动作。

操作符(deep_PRI,oper_PRI)

初始 deep_PRI=0

动作

输入’(’时,deep_PRI++

输入’)’时,deep_PRI--

输入操作符时,上一个操作符与其比较

优先级,为true,则输出上一操作符。

比较规则:

deep_PRI > deep_PRI ||

(deep_PRI == deep_PRI &&

oper_PRI >= oper_PRI)

输出

操作数直接

输出

5     5
+ +(0,7)    
( +(0,7) deep_PRI++  
8 +(0,7)   8
- +(0,7)

-(1,7)

+(0,7)与 -(1,7)比较

0>1||(0==1&&7>=7) 为false 不输出

 
2 +(0,7)

-(1,7)

  2
* +(0,7)

-(1,7)

*(1,9)

-(1,7)与 *(1,9)比较

1>1||(1==1&&7>=9) 为false 不输出

 
3 +(0,7)

-(1,7)

*(1,9)

  3
) +(0,7)

-(1,7)

*(1,9)

deep_PRI--  
* +(0,7)

-(1,7)

*(1,9)

*(0,9)

*(1,9)与 *(0,9)比较

1>0||(1==0&&9>=9) 为true 输出*(1,9)

*
  +(0,7)

-(1,7)

*(0,9)

-(1,7)与 *(0,9)比较

1>0||(1==0&&7>=9)为true 输出-(1,7)

-
  +(0,7)

*(0,9)

+(0,7)与 *(0,9)比较

0>0||(0==0&&7>=9) 为false 不输出

 
4 +(0,7)

*(0,9)

  4
  +(0,7)

*(0,9)

没有操作符:倒序输出临时空间值 *
  +(0,7)   +

C 四则运算表达式解析器的更多相关文章

  1. java字符串应用之表达式解析器

    一.表达式的组成    1.数字    2.运算符:+ - / * ^ % =    3.圆括号    4.变量二.运算符优先级    由高到低分别为:+-(正负号).^.*/%.+-.=    优先 ...

  2. [LeetCode] Ternary Expression Parser 三元表达式解析器

    Given a string representing arbitrarily nested ternary expressions, calculate the result of the expr ...

  3. Anrlr4 生成C++版本的语法解析器

    一. 写在前面 我最早是在2005年,首次在实际开发中实现语法解析器,当时调研了Yacc&Lex,觉得风格不是太好,关键当时yacc对多线程也支持的不太好,接着就又学习了Bison&F ...

  4. spring中EL解析器的使用

    SpEL对表达式语法解析过程进行了很高的抽象,抽象出解析器.表达式.解析上下文.估值(Evaluate)上下文等对象,非常优雅的表达了解析逻辑.主要的对象如下: 类名 说明 ExpressionPar ...

  5. SpringEl表达式解析

    应用场景: 1.用户日志 2.缓存处理 3........... import org.springframework.expression.EvaluationContext; import org ...

  6. Spring 缓存注解 SpEL 表达式解析

    缓存注解上 key.condition.unless 等 SpEL 表达式的解析 SpEl 支持的计算变量: 1)#ai.#pi.#命名参数[i 表示参数下标,从 0 开始] 2)#result:Ca ...

  7. SPEL 表达式解析

    Spring Expression Language 解析器 SPEL解析过程 使用 ExpressionParser 基于 ParserContext 将字符串解析为 Expression, Exp ...

  8. Spring 源码(5)BeanFactory使用的准备及自定义属性值解析器

    BeanFactory 使用前的准备 上一篇文章 https://www.cnblogs.com/redwinter/p/16165878.html 介绍了自定义标签的使用,完成了AbstractAp ...

  9. 用java实现编译器-算术表达式及其语法解析器的实现

    大家在参考本节时,请先阅读以下博文,进行预热: http://blog.csdn.net/tyler_download/article/details/50708807 本节代码下载地址: http: ...

随机推荐

  1. Java-Io之文件File

    File是"文件"和"目录路径名"的抽象表示形式.File之间继承Object,实现了Serializable和Comparable接口,因此文件支持File对 ...

  2. 《java入门第一季》之UDP协议下的网络编程详解

    首先看一下UDP协议的图解: 可以看到,分为发送端和接收端程序. 直接上代码: 发送端程序: import java.io.IOException; import java.net.DatagramP ...

  3. 【FPGA学习】Verilog之加法器

    在fpga工程应用设计中,随处可见加法器,乘法器等等.现在将一些常用模块和心得体会先记录下来,以便日后使用. 一位半加器: module halfadder(cout,sum,a,b); output ...

  4. iOS-导航头像缩放,支持点击回调

    在很多App中,经常存在一种需求就是,界面上下滚动时用户的头像也会跟着滚动,而用户头像在视图向上滚动一定范围时停留并在导航栏的位置 基本用法如下:1.单纯的实现这一效果: - (LEOHeaderVi ...

  5. 常见Css样式

    css就是就是会使用文档,css2.0中文手册下载地址:http://download.csdn.net/my <!DOCTYPE html PUBLIC "-//W3C//DTD X ...

  6. 手把手带你做一个超炫酷loading成功动画view Android自定义view

    写在前面: 本篇可能是手把手自定义view系列最后一篇了,实际上我也是一周前才开始真正接触自定义view,通过这一周的练习,基本上已经熟练自定义view,能够应对一般的view需要,那么就以本篇来结尾 ...

  7. Android群英传笔记——第十二章:Android5.X 新特性详解,Material Design UI的新体验

    Android群英传笔记--第十二章:Android5.X 新特性详解,Material Design UI的新体验 第十一章为什么不写,因为我很早之前就已经写过了,有需要的可以去看 Android高 ...

  8. UE4 Hello World 创建第一个UE4工程

    首先先熟悉几个UE4常用的类 AGameMode(控制整个项目的逻辑) The GameMode defines the game being played. It governs thegame r ...

  9. android Google推荐的容器SparseArrayCompat简介

    android Google推荐的容器SparseArrayCompat简介 private static SparseArrayCompat<BaseFragment> mCaches ...

  10. 使用JCrop进行图片裁剪,裁剪js说明,裁剪预览,裁剪上传,裁剪设计的图片处理的工具类和代码

     1.要想制作图片裁剪功能,可以使用网上的裁剪工具JCrop,网址是:https://github.com/tapmodo/Jcrop/ 案例效果如下: 2.引入JCrop的js代码,具体要引入那 ...