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. js排序算法总结—冒泡,快速,选择,插入,希尔,归并

    相信排序是任何一个程序猿都会用到的东西,今天简单总结记录下常见的排序算法. 一.冒泡排序 说起冒泡排序,可能每个人都不会陌生,实现思路相当简单明了,就是不停的对数组进行两两比较,将较大(较小)的一项放 ...

  2. sqlplus运行sql文件

    当sql文件的数据比较多的时候,pl/sql运行比较慢,可以通过oracle的sqlplus进行导入: sqlplus user/password@tnsname@sqlfile.sql; 注意如果文 ...

  3. ajax的一些笔试面试题

    1. 什么是ajax,为什么要使用Ajax(请谈一下你对Ajax的认识) 什么是ajax: AJAX是“Asynchronous JavaScript and XML”的缩写.他是指一种创建交互式网页 ...

  4. CSS Reset

    html, body, div, span, applet, object, iframe,h1, h2, h3, h4, h5, h6, p, blockquote, pre,a, abbr, ac ...

  5. pythonchallenge 解谜 Level 6

    第六关地址 http://www.pythonchallenge.com/pc/def/channel.html 和前几关一样,首先看网页源码吧.反正不看也没办法... <html>< ...

  6. php报表使用

    php报表的使用: 1.到官网(http://jpgraph.net/)下载,建议下载jpgraph-3.0.7.tar.gz版本 2.解压后有两个文件夹 docportal:使用手册 src:报表核 ...

  7. 2016huasacm暑假集训训练五 C-Common Subsequence

    题目链接:http://acm.hust.edu.cn/vjudge/contest/126708#problem/C 题意:这是一道求字符串的公共子串的最大长度的题目,用dp动态方程即可 if(a[ ...

  8. QQ表情的发送与接收

    我想大家对QQ表情一定不会陌生,一个个小头像极大丰富了聊天的乐趣,使得聊天不再是简单的文字叙述,还能够配上喜.怒.哀.乐等表达人物心情的小图片.本文重点要介绍的内容就是如何在微信公众平台使用QQ表情, ...

  9. Sage Crm 权限原理分析

    文字是11年写的,贴出来共享一下,先来一张表结构图: 一.区域.表名:[territories] 1.我们先来看看区域表的结构. 从图中前面都是不能为空的字段,都是很重要的.来介绍一下这些字段: Te ...

  10. C#与Java对比学习:类型判断、类与接口继承、代码规范与编码习惯、常量定义

    类型判断符号: C#:object a;  if(a is int) { }  用 is 符号判断 Java:object a; if(a instanceof Integer) { } 用 inst ...