C 四则运算表达式解析器
Posted milliebky
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 四则运算表达式解析器的主要内容,如果未能解决你的问题,请参考以下文章
SpringBoot 一篇搞定(Cookie Session 跳转 内容协商 converter解析器 thymeleaf)