Evaluate Math Expression
Evaluate Math Expression
摘要Abstract:本文简要介绍了数学表达式解析求值的几款开源软件,并结合程序代码说明了OpenCascade中表达式包的用法。也简要介绍了表达式解析求值在AVEVA Paragon模块中的应用。
关键字Key Words:Expression, Paragon, OpenCascade Expr package, muParser, MTParser
一、引言 Introduction
算术表达式中最常见的表示法形式有中缀、前缀和后缀表示法。中缀表示法(Infix notation)是书写表达式的常见方式,而前缀(prefix notation)、后缀表示法(postfix notation)主要用于计算机科学领域。算术表达式只包含操作数(operands)、二元操作符(binary operators)和一种括号(one kind of parentheses)。
Knuth将编写程序计算表达式的方法概括为三个步骤:
l 对中缀表达式进行语法分析;
l 中缀表达式到后缀表达式的转换;
l 对后缀表达式求值;
在《数据结构与算法》等相关的书籍中,还有如何将中缀表达式转换为后缀表达式的具体算法。
在AVEAV Plant(PDMS)的Paragon模块定义部件时,使用了参数化的表达式,从而实现了参数化的部件定义。其中参数化表达式的解析计算是其一个关键技术点。最近在写模型导出程序(Model Data Exchange Addin)时就遇到了这个问题,即参数化表达式的计算。好在AVEVA .Net给出了表达式计算类DbExpression,可以对PML的表达式进行解析计算,顺利解决了问题。
若想在自己的程序中实现数学表达式的解析求值,也有一些开源的工具可供选用。有些C++的数学表达式计算程序速度、效率还是很高的。在查看OpenCascade的文档时,发现其也有表达式求值的包,可用来对表达式进行计算。
发现OpenCascade已经有很多功能与AVEVA产品PDMS中的功能很类似,也难怪OpenCascade的前身Matra-Data Vision公司早期也有个集机械设计与工厂设计于一身的企业级并行工程解决方案Euclid集成系统。在1998年时Dassault Systèmes收购了EUCLID QUANTUM。
二、几款开源软件介绍 Introduce some tools
网上有很多开源的数学表达式解析求值的库,如:
l fparser
l muParser
l MTParse
在开源的二维CAD软件LibreCAD中就使用了muParser来对输入命令中的表达式进行解析。早期版本中使用了fparser。muParser小巧精干,提供LIB、DLL及源代码入方式。muParser最大的优点就是速度较快,更适合于实时性要求较高的环境,如Unix系统和单片机环境。源程序下载及文档说明可参考:
http://www.codeproject.com/cpp/FastMathParser.asp
MTParser优雅简洁,提供LIB、COM、源代码三种引入方式,是用典型C++风格编写的解析器,和muParser不同,它引入了多种设计模式,因而可扩展性的可维护性都很强。如作者所说,速度并不是TMParser最优先考虑的,也许文中所说的可扩展、可维护、易于使用、健壮性才是它的最大优势。源程序下载及设计文档可参考:
http://www.codeproject.com/Articles/7335/An-extensible-math-expression-parser-with-plug-ins
下面以一个具体实例来说明muParser的用法:(将muParser以源代码引入的方式加入到项目中),再编译如下代码:
程序运行结果如下所示:
如上程序所示,使用muParser可实现参数化表达式的计算,功能与AVEVA Plant(PDMS)中的Paragon模块中参数化表达式的计算方式已经很相近了。使用方法很简单。
三、Evaluate Expression in OpenCascade
在OpenCascade的TKAdvTools中有Expr包和ExprIntrp包,这两个包可用来对表达式进行解析和求值。但是在其文档《Foundation Classes User’s Guide》中并没有对TKAdvTools的工具进行说明。下面只给出一个简单实例来说明其应用,有兴趣的读者可以结合源程序对其具体实现进行研究。示例代码如下所示:
程序运行结果如下所示:
OpenCascade的表达式求值功能也很强大,这里只以一个简单示例来抛砖引玉啦。感觉OpenCascade的表达式包也可以像muParser, MTParser一样作为一个独立的工具来使用。
四、结论 Conclusion
因为AVEVA Plant(PDMS)的Paragon模块中的参数化部件定义方式,注意到了参数表达式的解析与求值。由于ModelDataExchangeAddin程序的需要,才去找寻开源的表达式解析与求值的库,谁知最后还是使用了AVEVA .Net中现成的DbExpression类,简化了程序的开发。
OpenCascade中竟然也有表达式解析与求值的工具,作为早期机械设计与工厂设计软件系统,可能都考虑过参数化这种方式。深入挖掘其源代码,对类似PDMS的工厂设计系统实现原理的理解有很大帮助。
五、参考资料 Bibliography
1. http://www.ibm.com/developerworks/cn/java/j-w3eva/
2. http://en.wikipedia.org/wiki/Euclid_(computer_program)
Evaluate Math Expression的更多相关文章
- [UE4]Math Expression计算数学公式,可以接受参数
- OpenCASCADE Expression Interpreter by Flex & Bison
OpenCASCADE Expression Interpreter by Flex & Bison eryar@163.com Abstract. OpenCASCADE provide d ...
- Emmet 使用说明。
Emmet for Sublime Text Official Emmet plugin for Sublime Text. How to install Available actions Exte ...
- Emmet的高级功能与使用技巧
Emmet系列教程 前端开发利器Emmet的介绍 Emmet快速编写HTML代码 Emmet快速编写CSS样式 Emmet快速编写CSS样式 编写好HTML和CSS代码时,我们也需要修改或添加一些内容 ...
- notepad++中的zencoding的快捷键修改[转]
在notepad++自己的”设置-->管理快捷键“中,找不到zen coding的快捷键,我又不想改掉已经用习惯了的ctrl+/,结果就用了一种比较偏门的修改快捷键的解决方案,希望可以帮到有同样 ...
- 谷歌浏览器web开发教程之开始篇:使用sublime
你的代码编辑器是主要的开发工具:你使用它去编辑和保存代码段.你可以通过学习编辑器快捷键和以及安装关键插件来好而快的写出代码. 目录 安装sublime文本编辑器 为什么使用包管理器? 安装插件 摘要 ...
- emmet高级技巧
编写好HTML和CSS代码时,我们也需要修改或添加一些内容,Emmet提供了很多非常独特的工具,可以大大提高编辑体验,下面我们挑选几个常用的功能来介绍. 萨龙龙发现在sublime text中安装的E ...
- 初用emmet
下载emmet的pspad插件emmet.js.复制到pspad目录下的 script\JScript 文件夹. 输入 ul#nav>li.item$*4>{Item $} 但是没反应. ...
- 【02】emmet系列之HTML语法
[01]emmet系列之基础介绍 [02]emmet系列之HTML语法 [03]emmet系列之CSS语法 [04]emmet系列之编辑器 [05]emmet系列之各种缩写 初始化 :快速编写HTML ...
随机推荐
- Git Commands Quick Notes
Fetch This command is to make sure your local repository has the same knowledge of the remote-tracki ...
- Curator Cache
1.Curator Cache 与原生ZooKeeper Wacher区别 原生的ZooKeeper Wacher是一次性的:一个Wacher一旦触发就会被移出,如果你想要反复使用Wacher,就要在 ...
- bzoj1412最小割
太羞耻了,m n写反了(主要是样例n m相等) 建图方法比较高(ji)端(chu),对于可以加栅栏的地方连上1的边,然后求最小割即可 为了让代码优(suo)美(duan),我写了一个check,避免多 ...
- 出现了内部错误-网站中X509Certificate2加载证书时出错
今天给网站配置了加密证书文件,用类X509Certificate2加载证书文件时,一直报出现了内部错误,但是Demo中用控制台程序加载证书没任何问题 读取证书文件的语句: X509Certificat ...
- bzoj 2563: 阿狸和桃子的游戏
开始写了一些东西但是后来浏览器挂了就没有存下来简直!!!!!!!!!!!!!QAQ 不想再写一遍了...总之是简单贪心. #include <iostream> #include < ...
- Python之路第一课Day9--随堂笔记之二(进程、线程、协程篇)
本节内容 进程.与线程区别 python GIL全局解释器锁 线程 语法 join 线程锁之Lock\Rlock\信号量 将线程变为守护进程 Event事件 queue队列 生产者消费者模型 Queu ...
- Allegro之无法保存(提示和用户有关或者和lock有关)
使用中无意出现此情况 无奈重新打开文件时发现brd文件下面有个.brd.lck文件,顺手删掉,回复正常~ 此为bug解bug,具体方法下次遇到再仔细研究是为什么~ 养成隔几分钟手动保存的好习惯,防止b ...
- Replace 删除、替换函数精解示例
'************************************************************************* '**模 块 名:Replace函数精解示例 '* ...
- 阿里聚安全受邀参加SFDC安全大会,分享互联网业务面临问题和安全创新实践
现今,技术引领的商业变革已无缝渗透入我们的日常生活,「技术改变生活」的开发者们被推向了创新浪潮的顶端.国内知名的开发者技术社区 SegmentFault 至今已有四年多了,自技术问答开始,他们已经发展 ...
- 《HiWind企业快速开发框架实战》(0)目录及框架简介
<HiWind企业快速开发框架实战>(0)目录及框架简介 本系列主要介绍一款企业管理系统快速开发框架,该框架旨在快速完成企业管理系统,并实现易维护可移植的目标. 使用逐个系统模块进行编码的 ...