表达式的设计思路.pdf

  1. 1、本文档共10页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
表达式设计思路 问题由来 在我做过的一个针对网络设备和主机的数据采集系统中,某些采集到的数据需要经过一定的计算后才保存入库, 而不是仅仅保存其原始值。为了提供给用户最大的灵活性,我设想提供一个用户界面,允许用户输入计算表达 式(或者称为计算公式)。这样,除了需要遵从少量的规则,用户可以得到最大的灵活性。 这样的表达式具有什么特点呢?它一般不是纯的可立即计算的表达式(简单的如:1+2*3-4 )。它含有我称为变 量的元素。变量一般具有特殊的内定的语法,例如可能用@totalmemory表示设备或主机(下面简称为设备) 的物理内存总数,那么表达式(@totalmemory-@freememory)/@totalmemory*100就表示设备当前内存 使用率百分比。如果与告警系统联系起来,监测此值超过80 系统就发出Warning ,那么这就成为一件有意义 的事情。不同种类的采集数据入库前可能需要经过复杂度不同的计算。但显然,最后求值的时候,必须将那些 特定的变量用具体数值(即采集到的具体数值)替换,否则表达式是不可计算的。这个过程是在运行时发生的。 问题的一般性 我认为表达式计算是个一般性的话题,并且也不是一个新的话题。我们可能在多处碰到它。我在读书的时候编 写过一个表达式的转换和计算程序,当时作为课余作业。我看到过一些报表系统,不管它是单独的,还是包含 在 MIS 系统、财务软件中,很多都支持计算公式。我认为这些系统中的计算公式和我所遇到的问题是大致相同 的。对我来说,我在数据采集项目中遇到这个问题,下次可能还会在其他项目中遇到它。既然已经不止一次了, 我希望找到一个一般性的解决方案。 一些已有的设计和实现不能满足要求 在设计和实现出第一个版本之后,我自己感觉不很满意。随后我花点时间上网搜索了一下(关键字:表达式 中 缀 后缀 or Expression Infix Postfix )。令人稍感失望的是,所找到的一些关于表达式的转换、计算的程序不 能满足我的要求。不少这样的程序仅仅支持纯的可立即计算的表达式,不支持变量。而且,表达式解析和计算 是耦合在一起的,很难扩展。增加新的运算符(或新的变量语法)几乎必定要修改源代码。在我看来,这是最 大的缺陷了(实际上,当年我编写的表达式转换和计算的程序,虽然当时引以自豪,但是现在看来也具有同样 的缺陷)。但是,表达式的转换和计算本身有成熟的、基于栈的的经典算法,许多计算机书籍或教材上都有论述。 人们以自然方式书写的表达式是中缀形式的,先要把中缀表达式转换为后缀表达式,然后计算后缀表达式的值。 我打算仍然采用这个经典的过程和算法。 我的设计想法和目标 既然表达式的转换和计算的核心算法是成熟的,我渴望把它们提取出来,去除(与解析相关的)耦合性!试想, 如果事物具有相对完整的内涵和独立性,会产生这个需要,并且也能够通过形式上的分离和提取来把内涵给表 现出来,这个过程离不开抽象。我不久意识到自己实际上在设计一个小规模的关于表达式计算的框架。 表达式要支持加减乘除运算符,这是基本的、立即想到的。或许还应该支持平方,开方(sqrt ),三角运算符如 sin ,cos 等。那么如果还有其它怎么办,包括自定义的运算符?你能确定考虑完备了吗?像自定义的运算符, 是完全存在的、合理的需求。在数据采集系统中,我一度考虑引入一个diff 运算符,表明同一个累加型的采集 量,在相距最近的两次(即采集周期)采集的差值。以上的思考促使我决定,运算符的设计必须是开放的。用 户(这里指的是用户程序员,下同)可以扩展,增加新的运算符。 表达式中允许含有变量。对于变量的支持贯穿到表达式解析,转换,计算的全过程。在解析阶段,应该允许用 户使用适合他/她自己的变量语法,我不应该事先实现基于某种特定语法的变量识别。 由于支持可扩展的运算符,未知的变量语法,甚至连基本的数值(象123 ,12.3456 ,1.21E17 )理论上也有多 种类型和精度(Integer/Long/Float/Double/BigInteger/BigDecimal ),这决定了无法提供一个固化的表达 式解析方法。表达式解析也是需要可扩展的。最好的结果是提供一个容易使用和扩展的解析框架。对于新的运 算符,新的变量语法,用户在这个框架上扩展,以提供增强的解析能力。从抽象的角度来看,我打算支持的表 达式仅由四种元素组成:括号(包括左右括号),运算符,数值和变量。一个最终用户给出的表达式字符串,解 析通过后,可能生成了一个内部表示的、便于后续处理的表达式,组成这个表达式的每个元素只能是以上四种 之一。 数值 一开

文档评论(0)

189****6140 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档