- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
1款设计精巧的表达式解析器
一款设计精巧的表达式解析器 ---- 开发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
您可能关注的文档
最近下载
- 蒋场110kv输变电工程_竣工预验收报告.pdf VIP
- 上海三菱LEHY-MRL标准接线图.pdf VIP
- 云南省昭通市昭阳区2024-2025学年九年级上学期1月期末化学试题(含答案).pdf VIP
- 2025至2030中国血糖监测市场供需状况与发展行情走势研究报告.docx VIP
- 2026年全国硕士研究生招生考试管理类联考综合能力试卷及答案.docx VIP
- 贝伐珠单抗在肺腺癌中的应用.pptx VIP
- 研究生考试考研管理类综合能力(199)2025年模拟试题及答案解析.docx VIP
- 不同参数设置下里管结构对微纳气泡形成的空化效应研究.docx VIP
- 营销技巧培训PPT课件:如何建立客情关系.pptx
- LEHY-MRL无机房电梯电路板简图.pdf VIP
原创力文档


文档评论(0)