OpenCASCADE Expression Interpreter by Flex & Bison

OpenCASCADE Expression Interpreter by Flex & Bison

eryar@163.comhtml

Abstract. OpenCASCADE provide data structure of any expression, relation or function used in mathematics. Flex and Bison are tools for building programs that handle structured input. They were originally tools for building compilers, but they have proven to be useful in many other areas. The Expression Interpreter in OpenCASCADE is made by Flex and Bison. So let’s know something about Flex and Bison.express

Key Words. OpenCASCADE, Expression Interpreter, Flex, Bison数据结构

1.Introduction ide

OpenCASCADE的TKMath中提供了数学表达式求解的包Expr和ExprIntrp,用来对数学表达式或函数进行解析计算。所谓的数学表达式如:sin(10)+20*6-6/3等。之前在《数据结构》的书上看到用栈的方式来对简单表达式求值,感受已经很不错了。可是若是表达式中包含三角函数、对数、指数等,程序就要复杂了。如何简单、优雅地去解决这个问题,当时也是很茫然。函数

工做中遇到前辈本身写了一个用于定义几何的语言,还能够计算表达式。虽然没有看到源码,对其已经是崇拜不已。后来接触了脚本语言,像Tcl/Tk,Python之类,发现原来利用这些开源库,也是能够实现一个简单、稳定的自定义开发语言。由于这类脚本不只能够计算表达式,还能够计算带参数的表达式,如:工具

set x 3 set y 4 set z [expr sqrt($x*$x+$y*$y)]

只要你在Unix环境中写过程序,你一定会邂逅神秘的Lex&YACC,就如GUN/Linux用户所熟知的Flex&Bison,这里的Flex就是由Vern Paxon实现的一个Lex,Bison则是GNU版本的YACC。学习过《编译原理》的同窗们对这两个神器应该不会陌生。使用这两个工具,不只能够实现一个表达式解析计算器,还能够用来解析SQL语法,如PostgreSQL中就是使用他们实现SQL语法解析。甚至还能够实现一个编译器。post

由于是Unix上的工具,在Windows上须要使用winflexbison,能够从sourceforge上下载:https://sourceforge.net/projects/winflexbison/学习

本文介绍如何使用Flex来理解OpenCASCADE中ExprInterp的实现,开阔视野。OpenCASCADE中ExprInterp的用法见:Evaluate Math Expressionflex

http://www.cppblog.com/eryar/archive/2013/10/09/203625.htmlui

2.Flex Example

FLEX是一个自动化工具,能够按照定义好的规则自动生成一个C函数yylex(),也成为扫描器(Scanner)。这个C函数把文本串做为输入,按照定义好的规则分析文本串中的字符,找到符合规则的一些字符序列后,就执行在规则中定义好的动做(Action)。例如在规则中能够这样定义:若是遇到一个换行字符\n,那么就把行计数器的值加一。 

Flex文件就是一个文本文件,内容包括定义好的一系列词法规则。文件的命名习惯上以小写字母l(L)来做为文件后缀。若是为了清晰,也能够用.flx或者.flex做为文件的后缀名。Flex文件完成后,就执行下列命令: 

$ flex example.flex 

这个命令执行后将生成一个C文件,默认文件名为lex.yy.c。这个C文件主要内容就是函数yylex()的定义。 

若是要直接将这个文件编译成为一个可执行程序,还有一些要注意的地方。若是在Flex文件中没有提供main()函数的定义,那么这个C文件中不会有main()函数。此时单独编译这个C文件的时候,必定要加上-lfl的链接库参数;若提供了main()函数,就没必要要提供这个链接库参数了。链接库libfl提供了一个缺省的main函数。缺省的main()函数中只是简单地调用yyflex()函数,而本身提供的main()函数则能够根据须要加入许多其余的处理代码。 

词法规范定义文件给出了单词构成规则。词法文件在习惯上用字母l(即L的小写)来做为后缀。Flex文件由三个部分组成。或者说三个段。三个段之间用两个%%分隔。 

定义段(definitions) 

%% 

规则段(rules) 

%% 

用户代码段(user code) 

下面给出一个简单的Flex程序,代码以下所示: 

/* hello world for Flex. */
%option noyywrap %{ int char_count = 0; int line_count = 0; %} %% \n { ++char_count; ++line_count; } . { ++char_count; } %%

int main(int argc, char* argv[]) { yylex(); printf("# of lines = %d, # of chars = %d\n", line_count, char_count); return 0; }

将上述文件保存为hello.lex,而后运行以下图所示命令:

wps_clip_image-23184

会生成一个lex.yy.c的源程序,将这个C源文件编译,连接便可生成一个可执行程序。运行程序以下图所示:

wps_clip_image-834

3.Flex and Bison in occ

在OpenCASCADE的文件夹中也有相关的语法规则定义,以下图所示:

wps_clip_image-1855

由上图可知,OpenCASCADE的表达式解析功能的实现也是利用了Flex和Bison。

wps_clip_image-32767

wps_clip_image-19144

4.Conclusion

借助于Flex和Bison这两个强大的工具,你能够实现一个高级的计算器,即任意数学表达式计算器。

OpenCASCADE的ExprInterp使用了Flex和Bison实现了数学表达式的解析计算。当理解了工具的用途,有兴趣的读者不妨结合《编译原理》等理论知识,对工具的原理进行一番探究。

5.References

1. 严蔚敏, 吴伟民. 数据结构(C语言版). 清华大学出版社. 1997

2. 赵建华, 郑滔, 戴新宇 译. 编译原理. 机械工业出版社. 2011

3. John Levine, flex & bison. O’REILLY. 2009

相关文章
相关标签/搜索