Evaluate Math Expression

eryar@163.com

摘要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以源代码引入的方式加入到项目中),再编译如下代码:

                                   }

程序运行结果如下所示:

  Press any key to continue . . .

如上程序所示,使用muParser可实现参数化表达式的计算,功能与AVEVA Plant(PDMS)中的Paragon模块中参数化表达式的计算方式已经很相近了。使用方法很简单。

三、Evaluate Expression in OpenCascade

在OpenCascade的TKAdvTools中有Expr包和ExprIntrp包,这两个包可用来对表达式进行解析和求值。但是在其文档《Foundation Classes User’s Guide》中并没有对TKAdvTools的工具进行说明。下面只给出一个简单实例来说明其应用,有兴趣的读者可以结合源程序对其具体实现进行研究。示例代码如下所示:

                                  }

程序运行结果如下所示:

  Press any key to continue . . .

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的更多相关文章

  1. [UE4]Math Expression计算数学公式,可以接受参数

  2. OpenCASCADE Expression Interpreter by Flex & Bison

    OpenCASCADE Expression Interpreter by Flex & Bison eryar@163.com Abstract. OpenCASCADE provide d ...

  3. Emmet 使用说明。

    Emmet for Sublime Text Official Emmet plugin for Sublime Text. How to install Available actions Exte ...

  4. Emmet的高级功能与使用技巧

    Emmet系列教程 前端开发利器Emmet的介绍 Emmet快速编写HTML代码 Emmet快速编写CSS样式 Emmet快速编写CSS样式 编写好HTML和CSS代码时,我们也需要修改或添加一些内容 ...

  5. notepad++中的zencoding的快捷键修改[转]

    在notepad++自己的”设置-->管理快捷键“中,找不到zen coding的快捷键,我又不想改掉已经用习惯了的ctrl+/,结果就用了一种比较偏门的修改快捷键的解决方案,希望可以帮到有同样 ...

  6. 谷歌浏览器web开发教程之开始篇:使用sublime

    你的代码编辑器是主要的开发工具:你使用它去编辑和保存代码段.你可以通过学习编辑器快捷键和以及安装关键插件来好而快的写出代码. 目录 安装sublime文本编辑器 为什么使用包管理器? 安装插件 摘要 ...

  7. emmet高级技巧

    编写好HTML和CSS代码时,我们也需要修改或添加一些内容,Emmet提供了很多非常独特的工具,可以大大提高编辑体验,下面我们挑选几个常用的功能来介绍. 萨龙龙发现在sublime text中安装的E ...

  8. 初用emmet

    下载emmet的pspad插件emmet.js.复制到pspad目录下的 script\JScript 文件夹. 输入 ul#nav>li.item$*4>{Item $} 但是没反应. ...

  9. 【02】emmet系列之HTML语法

    [01]emmet系列之基础介绍 [02]emmet系列之HTML语法 [03]emmet系列之CSS语法 [04]emmet系列之编辑器 [05]emmet系列之各种缩写 初始化 :快速编写HTML ...

随机推荐

  1. Linux(Ubuntu) Mysql的安装配置例子以及常用命令

    1.安装配置例子 有空再写 2.注意事项 (1)启动mysql 在/etc/mysql 目录下 service mysql start  新版本是(service mysqld start  ) (2 ...

  2. android 5.0以上通知栏、状态栏图标变成白色

    在5.0以上的系统上发现,平常的自定义notification出来的icon,居然在状态栏上变成了纯白色的icon. 看源代码会发现: protected void applyColorsAndBac ...

  3. Java:单例模式的七种写法

    第一种(懒汉,线程不安全): 1 public class Singleton { 2 private static Singleton instance; 3 private Singleton ( ...

  4. [RxJava]在学习RxJava中的错误理解

    关于RxJava语法的问题与理解   最近看到一个blog-RxJava 写到关于Observable数据异步加载的介绍.针对fromCallable和just操作符在使用上的问题来跟大家针对代码进行 ...

  5. Ambari组件黄色预警

    Ambari组件黄色预警 组件上为黄色问号,代表心跳丢失,解决如下: 1.  查看个节点之间是否可以相互通信,若ssh连接不上,有可能是该节点关机了,没有打开,手动开启该节点,再次验证是否可互通. 2 ...

  6. sql 连接数不释放 ,Druid异常:wait millis 40000, active 600, maxActive 600

    Hibernate + Spring + Druid 数据库mysql 由于配置如下 <bean id="dataSource" class="com.alibab ...

  7. MySQL操作使用

    这只是一些简单的数据库命令,作为新手记录一下,以供后面查询使用. 查询服务器版本号和当前日期: select version(), current_date; 一个命令通常用一个SQL语句组成,后面跟 ...

  8. 已经过事务处理的 MSMQ 绑定(转载)

    https://msdn.microsoft.com/zh-cn/biztalk/ms751493 本示例演示如何使用消息队列 (MSMQ) 执行已经过事务处理的排队通信. 注意 本主题的末尾介绍了此 ...

  9. ENode框架Conference案例分析系列之 - 订单处理减库存的设计

    前言 前面的文章,我介绍了Conference案例的业务.上下文划分.领域模型.架构,以及代码整体流程.接下来想针对案例中一些重要的场景,分别做进一步的分析.本文想先介绍一下Conference案例的 ...

  10. Hadoop学习笔记—3.Hadoop RPC机制的使用

    一.RPC基础概念 1.1 RPC的基础概念 RPC,即Remote Procdure Call,中文名:远程过程调用: (1)它允许一台计算机程序远程调用另外一台计算机的子程序,而不用去关心底层的网 ...