C 四则运算表达式解析器
下载实例: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 四则运算表达式解析器的更多相关文章
- java字符串应用之表达式解析器
一.表达式的组成 1.数字 2.运算符:+ - / * ^ % = 3.圆括号 4.变量二.运算符优先级 由高到低分别为:+-(正负号).^.*/%.+-.= 优先 ...
- [LeetCode] Ternary Expression Parser 三元表达式解析器
Given a string representing arbitrarily nested ternary expressions, calculate the result of the expr ...
- Anrlr4 生成C++版本的语法解析器
一. 写在前面 我最早是在2005年,首次在实际开发中实现语法解析器,当时调研了Yacc&Lex,觉得风格不是太好,关键当时yacc对多线程也支持的不太好,接着就又学习了Bison&F ...
- spring中EL解析器的使用
SpEL对表达式语法解析过程进行了很高的抽象,抽象出解析器.表达式.解析上下文.估值(Evaluate)上下文等对象,非常优雅的表达了解析逻辑.主要的对象如下: 类名 说明 ExpressionPar ...
- SpringEl表达式解析
应用场景: 1.用户日志 2.缓存处理 3........... import org.springframework.expression.EvaluationContext; import org ...
- Spring 缓存注解 SpEL 表达式解析
缓存注解上 key.condition.unless 等 SpEL 表达式的解析 SpEl 支持的计算变量: 1)#ai.#pi.#命名参数[i 表示参数下标,从 0 开始] 2)#result:Ca ...
- SPEL 表达式解析
Spring Expression Language 解析器 SPEL解析过程 使用 ExpressionParser 基于 ParserContext 将字符串解析为 Expression, Exp ...
- Spring 源码(5)BeanFactory使用的准备及自定义属性值解析器
BeanFactory 使用前的准备 上一篇文章 https://www.cnblogs.com/redwinter/p/16165878.html 介绍了自定义标签的使用,完成了AbstractAp ...
- 用java实现编译器-算术表达式及其语法解析器的实现
大家在参考本节时,请先阅读以下博文,进行预热: http://blog.csdn.net/tyler_download/article/details/50708807 本节代码下载地址: http: ...
随机推荐
- Linux Debugging(七): 使用反汇编理解动态库函数调用方式GOT/PLT
本文主要讲解动态库函数的地址是如何在运行时被定位的.首先介绍一下PIC和Relocatable的动态库的区别.然后讲解一下GOT和PLT的理论知识.GOT是Global Offset Table,是保 ...
- Linux进程-进程的创建
今天学习了Linux的进程创建的基本原理,是基于0.11版本核心的.下面对其作一下简单的总结. 一.Linux进程在内存中的相关资源 很容易理解,Linux进程的创建过程就是内存中进程相关资源产生 ...
- ubuntu更改用户密码
在安装ubuntu时使用了主目录加密的功能( 登入时需要密码并加密我的主目录), 设此时密码为abcd1234, 如果修改了用户的密码(passwd=>abcde12345),那么在下次启动时, ...
- BLOCK/字面量(语法糖)OC——第六天
1.//block ,块语法,实质是匿名函数,是对C语言中函数的扩充,扩展: //block 语法可以用来保存一段代码或者用来调用一段封装好的代码: //block 语法由于是C语言实现的,所以执 ...
- 4.5、Libgdx运行日志管理
(原文:http://www.libgdx.cn/topic/47/4-5-libgdx%E8%BF%90%E8%A1%8C%E6%97%A5%E5%BF%97%E7%AE%A1%E7%90%86) ...
- 《java入门第一季》集合框架引入与面试题
注:在开始的几篇集合介绍里,不包含泛型的概念.泛型在讲述所有集合后再加入进去. 集合的由来: 我们学习的是面向对象语言,而面向对象语言对事物的描述是通过对象体现的,为了方便对多个对象进行操作,我 ...
- linux shell (()) 双括号运算符使用
估计很多朋友都感觉比较难以接受.特变逻辑运算符"[]"使用时候,必须保证运算符与算数 之间有空格. 四则运算也只能借助:let,expr等命令完成. 今天讲的双括号"(( ...
- 【一天一道LeetCode】#53. Maximum Subarray
一天一道LeetCode系列 (一)题目 Find the contiguous subarray within an array (containing at least one number) w ...
- C#之面向对象
话说三国时期,曹操带领百万大军攻打东吴,大军在长江赤壁驻扎,军船连成一片,眼看就要灭掉东吴,统一天下,曹操大悦,于是晏众文武,在酒席间,曹操诗兴大发,不觉吟道:"喝酒唱歌,人生真爽" ...
- spring揭秘 读书笔记 二 BeanFactory的对象注册与依赖绑定
本文是王福强所著<<spring揭秘>>一书的读书笔记 我们前面就说过,Spring的IoC容器时一个IoC Service Provider,而且IoC Service Pr ...