下载实例: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. C#之面向对象

    话说三国时期,曹操带领百万大军攻打东吴,大军在长江赤壁驻扎,军船连成一片,眼看就要灭掉东吴,统一天下,曹操大悦,于是晏众文武,在酒席间,曹操诗兴大发,不觉吟道:"喝酒唱歌,人生真爽" ...

  2. 【Android 应用开发】分析各种Android设备屏幕分辨率与适配 - 使用大量真实安卓设备采集真实数据统计

    .主要是为了总结一下 对这些概念有个直观的认识; . 作者 : 万境绝尘  转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/198 ...

  3. iOS开发经验相关知识

    一. iPhone Size 手机型号 屏幕尺寸 iPhone 4 4s 320 * 480 iPhone 5 5s 320 * 568 iPhone 6 6s 375 * 667 iphone 6 ...

  4. mysql进阶(五)数据表中带OR的多条件查询

    MySQL数据表中带OR的多条件查询 OR关键字可以联合多个条件进行查询.使用OR关键字时: 条件 1) 只要符合这几个查询条件的其中一个条件,这样的记录就会被查询出来. 2) 如果不符合这些查询条件 ...

  5. Leetcode_114_Flatten Binary Tree to Linked List

    本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/42744919 Given a binary tree, f ...

  6. 打包volley

    1.如果电脑没有安装git和ant的话,需要安装git和ant,直接Google就可以,并配置环境变量 2.在命令行执行 git clone https://android.googlesource. ...

  7. infiniDB的论坛

    http://infinidb.co/community 包括了基本的内容. 安装目录?

  8. 《java入门第一季》之面向对象(方法重写问题)

    方法重载的引入:根据一个案例: /* 继承中成员方法的关系: A:子类中的方法和父类中的方法声明不一样,这个太简单. B:子类中的方法和父类中的方法声明一样,这个该怎么玩呢? 通过子类对象调用方法: ...

  9. Android MTK平台最完备的开机动画修改教程

    修改手机的开机动画不是什么难事儿. 但修改一款很冷门的"山寨机",就不太好修改第一屏了. 手机是MTK的一款手机,虽然比较贵(价格超过三星Note3),但在我看来跟山寨机木有啥区别 ...

  10. C++之默认参数

    C++可以为不指定参数提供默认值.一旦给一个参数赋了默认值,后面的所有参数,也都必须为默认值,并且默认值的类型也必须正确,默认值可以在原型或者函数定义中给出,但是不能两个位置同时给出. 接下来我们上代 ...