- 1、本文档共5页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
一款设计精巧的达式解析器
一款设计精巧的表达式解析器 ---- 开发MIS系统时,报表设计中经常会碰到表达式解释器,完成用户自定义的公式运算。这种程序的设计需要有比较高的技巧,以下介绍一款用DELPHI4.0开发的程序[程序重在算法,语言特性很少,用其它语言的人也能读懂],只要按自已的要求稍加修改,即可做成组件或全局方法发部。它支持 加[+]、减[-]、乘[*]、除[/]、商[$:两整数相除,结果的整数部分]、模[%]、括号[()]四则混合运算,支持与[]、或[|]、异或[^]、左移[ ]、右移[ ]和非[!]逻辑运算功能,同时它们可以出现在同一个表达式中,它们的优先级依次为括号、非、与或异或左右移、乘除商模、加减。如式:12.45+3*16 2*(3+6*(3+2)-1)=12.45+3*4*32,计算结果为:396.45。程序包括两大部分功能:表达式拆解、因子计算,分别由两个类TBdsProc和TPUSHPOP完成。具体如下: CDIKind=record??case id: Boolean of???True: (dval: Double);???False: (ival: Integer);end;CDKind:区别表达式中的整数和浮点数类型,因为有些运算符不支持浮点数(如逻辑运算)。ValKind = CDIKind;TBdsProc = classprivate??Fghpd : Integer;//识别并标记左右括号是否成对出现??function IsCalcFh(c: Char): boolean;??//判别一个字符是否运算符??function CopyRight(abds: String;start: Integer):??String;//截取字符串表达式??function BdsSs(var abds: String): ValKind;??//返回一个子表达式的值??function BdsYz(var abds: String): ValKind;??//表达式因子,如:15、(13+5)??function BdsItm(var abds: String): ValKind;??//读取表达式中的一个因子public??function CalcValue(const bds: String): ValKind;??//返回计算结果end;TPUSHPOP = classprivate??ffh: array [0..2] of Char;//符号数组??value: array [0..3] of CDIKind;//值数组??flevel: Byte;//因子个数??fisfh: Boolean;//识别等待输入值或运算符??fisnot: Boolean;//识别待计算数据项是否执行非运算??function Calcsj(av1,av2: CDIKind;fh: Char): CDIKind;??//执行两个数值的四则运算??function Calclg(av1,av2: CDIKind; fh: Char): CDIKind;??//执行两个数的逻辑运算??procedure Calccur;{当输入数据项满足四个数后[依运算优先级层数求得,见下述算式解析原理]执行中间运算}??function IsLgFh(fh: Char): Boolean;??//一个符号是否逻辑运算符??function IsCcFH(fh: Char): Boolean;??// 一个符号乘除商模运算符public??constructor Create;??procedure PushValue(avalue: CDIKind);//存入一个数据项??procedure PushFh(afh: Char);//存入一个符号??function CalcValue: CDIKind;//计算并返回值end;---- 表达式解析基本原理: ---- 1.表达式处理: ---- 表达式的一个个数据项组成,中间由运算符连接,每个数据项为一个分析基本分析单元。表达式中如果包含有改变运算优先级别的括号运算,先计出括号中式子的值,再把该值当一个数据项处理,这一点在程序设计中只要运用递归功就能实现。 ---- 2.数据项计算处理 ---- a 非运算: ---- 它为单目运算符,级别最高,在存入符号时做标记,存入数据时即时计算并去除标记。 ---- b 表达式运算: ---- 设f1、f2、f3分别表示一二三级运算符,V1、V2、V3、V4分别表示顺序四个数,则极端表达式模型为R=V1 f1 V2 f2
您可能关注的文档
- 【赢在起点】213届高考生物一轮复习学案:第一单元走近细胞.doc
- 【走向高考】(013春季发行)高三数学第一轮总复习 9-6空间向量及其运算 理 新人教A版.doc
- 【走向高考】215高考历史一轮总复习 第4单元第2讲 音乐、美术与影视强化作业 岳麓版必修3.doc
- 【走向高考】216届高三物理人教版一轮复习习题:第9章 第3讲电磁感应中的综合应用.doc
- 【高三总复习】013高中数学技能特训:8-3 直线、圆与圆的位置关系及空间直角坐标系(人教B版) 含解析.doc
- 【集合竞价选股】—【山人】专供.doc
- 【高中数学】任角的三角函数,同角三角函数基本关系专题讲义[附练习与答案]强烈推荐!.doc
- 【高中生物】遗的细胞基础与分子基础.doc
- 【高考总复习必】2013年高考数学闯关密练特训7-2基本不等式新人教A版(含解析).doc
- 【高考总复习必】2013年高考数学闯关密练特训8-7圆锥曲线的综合问题(理)新人教A版(含解析).doc
文档评论(0)