C# 四则运算表达式解析器分析
来源:互联网 发布:棋牌数据库搭建 编辑:程序博客网 时间:2024/06/05 04:21
最近看了一些关于表达式求值的文章,四则运算表达式求值,在网络上各种语言的版本都能找到。了解其基本原理,方便在一些应用系统中的应用扩展。下面是在自己理解的基础上,用C#语言,以比较简单直观的方法实现四则运算表达式求值程序。
程序主要包括:基础结构定义、词法分析、语法分析、算术运算
基础结构定义:枚举(操作数类型、操作符类型、标记类型、有限状态自动机);
结构(操作数、操作符、标记、标记链)。
词法分析:将字符串分解成有效标记(有效的操作数和操作符),生成标记链表。
语法分析:分析括弧的有效性,操作数、操作符的排列有效性,操作符与操作数类型匹配关系。
算术运算:使用后缀表达式运算规则,根据后缀表达式链表进行求值。首先将我们日常应用的中缀表达式转换为后缀表达式。例如:6*(5-3) 转换为 6 5 3 - *,6-2+5*2转换为 6 2 - 5 2 * +
源码下载:http://download.csdn.net/source/3187947
这里对后缀表达式的转换作一个说明,每个操作符有一个运算优先级(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# 四则运算表达式解析器分析
- 四则运算表达式解析
- 解析表达式 四则运算
- Qt解析四则运算表达式
- 1024. 分析四则运算表达式
- Java四则运算(+、-、*、/、)以及三角函数表达式解析器
- C#表达式解析器
- 使用 正则表达式 解析四则运算式
- + - * / ( ) 四则运算表达式解析的初步实现
- C# 解析简单的四则运算字符串,
- 表达式四则运算。
- c#四则运算
- javascript中解析四则运算表达式的算法和示例
- 计算解析四则运算表达式【带负号和括号】
- 利用逆波兰表达式(后缀表达式)解析四则运算表达式的详细源代码及解释
- 四则运算表达式实现
- 四则运算-表达式求值
- 四则运算表达式 栈
- 哈哈
- 逆向:Ucoresys.sys (一)
- LINUX挂载U盘
- sql语句执行时间和性能
- CDialog动态创建无资源工具条方法
- C# 四则运算表达式解析器分析
- C++测试题2
- 使用C#做类似MFC中的菜单、工具命令管理工具。
- 记一次保存UIWebView的缓存经历(一)
- Solaris10 配置DNS
- Java中split的用法小结
- linux下fastcgi安装配置
- 共享库注入
- Flash加载外部文件多法