为什么80%的码农都做不了架构师?>>>   

OpenCASCADE Expression Interpreter by Flex & Bison

eryar@163.com

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.

Key Words. OpenCASCADE, Expression Interpreter, Flex, Bison

1.Introduction

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语法解析。甚至还可以实现一个编译器。

因为是Unix上的工具,在Windows上需要使用winflexbison,可以从sourceforge上下载:https://sourceforge.net/projects/winflexbison/

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

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

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,然后运行如下图所示命令:

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

3.Flex and Bison in occ

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

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

4.Conclusion

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

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

5.References

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

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

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

PDF Version: OpenCASCADE Expression Interpreter by Flex & Bison

转载于:https://my.oschina.net/eryar/blog/683212

OpenCASCADE Expression Interpreter by Flex Bison相关推荐

  1. 使用Flex Bison 和LLVM编写自己的编译器[zz]

    1.介绍 我总是对编译器和语言非常感兴趣,但是兴趣并不会让你走的更远.大量的编译器的设计概念可以搞的任何一个程序员迷失在这些概念之中.不用说,我也曾 今尝试过,但是并没有取得太大的成功,我以前的尝试都 ...

  2. 最简单的flex bison例子

    最简单的flex & bison例子 y.tab.h /* A Bison parser, made by GNU Bison 2.3. *//* Skeleton interface for ...

  3. 基于flex/bison工具生成sysY2022文法的词法/语法分析器

    基于flex/bison工具生成sysY2022文法的词法/语法分析器 本文内容学习借鉴了往届参赛的优秀校友学长学姐的开源作品代码,仅用于学习目的,现分享给大家,如有侵权请联系我删除.我使用的开发环境 ...

  4. flex bison 基础概述

    1. 前言 限于作者能力水平,本文可能存在谬误,因此而给读者带来的损失,作者不做任何承诺. 2. 本文目标 . 简单介绍 flex 和 bison 的基础使用方法 . 简要分析 flex, bison ...

  5. Flex Bison 开始

    Flex 与 Bison 是为编译器和解释器的编程人员特别设计的工具: Flex 用于词法分析(lexical analysis,或称 scanning),把输入分割成一个个有意义的词块,称为记号(t ...

  6. VS2017中使用flex+bison

    本文参考了https://blog.csdn.net/tankloverainbow/article/details/86653044 1.下载地址 https://jaist.dl.sourcefo ...

  7. Lex+YACC( Flex+Bison)

    源码 编译前期最常实验的工具,分别是用来做 lexical analyse 和 semantic analyse 的,这两个工具的使用基本不需要很深的编译知识,只需要掌握正则表达式的书写(lexica ...

  8. flex bison解析json文件_每秒解析千兆字节的 JSON 解析器开源了

    本文转自我们的网站 InfoQ,译者无明.除了推荐 simdjson 之外,还想测试一下微信平台编辑器的代码样式功能. 事实证明,微信文章的代码展示能力很强了.非常棒. 近日,GitHub 开源了一 ...

  9. 手把手教程-lex与yacc/flex与bison入门(一)(使用windows环境)

    前言 1.文章诞生的契机 在计算机学习中,我们有时可能会想到自制一门属于自己的编程语言,此时选择lex与yacc来生成词法分析器与语法分析器是非常不错的选择.然而,这两个工具虽然用起来简单,但对于新手 ...

  10. 编译器(汇编器)开发工具Flex和Bison的使用方法之Flex

    点击打开链接 编译器和汇编器在工作过程中,往往完成如下的任务: (1) 读取源代码并且获得程序的结构描述: (2) 分析程序结构,并且生成相应的目标代码. Flex和Bison就是为可以帮助完成以上任 ...

最新文章

  1. linux字体如何删除不了,如何彻底替换Ubuntu下Chrome字体(清除楷体字)
  2. 史海峰:万字长文剖析技术人如何成长
  3. java swing界面工具_Java GUI swing 工具包使用总结
  4. 深入了解nginx.conf配置文件
  5. C语言栈的面试题,[面试题]EMC易安信-C语言函数堆栈的思考
  6. java 静态传值到构造器_java 静态初始化块,初始化块,构造器执行顺序
  7. 浅谈5000万:外挂,代理与卡盟的故事。
  8. 通信原理中的erf/erfc函数
  9. android加载dex方法,android Dex文件的加载
  10. Android Material-dialogs的使用(kotlin)
  11. Chrome浏览器隐藏彩蛋
  12. 克拉默法则的理解记忆方法
  13. centos pptp client 配置
  14. 办公计算机锁屏方法,电脑快速锁屏,办公室神技能,再也不怕别人看我的电脑了!...
  15. 那些让我印象深刻的五个bug
  16. Windows如何安装WSL(中途退出后遇到bug该怎么办)
  17. JS十六进制,CRC冗余,小程序发送蓝牙数据,十六进制GBK编码转换等
  18. Redis 存入key乱码问题
  19. Python运维常用的脚本,提高工作效率就靠它了
  20. 网易我的世界手游服务器怎么发全体信息,网易我的世界手机怎么私聊 | 手游网游页游攻略大全...

热门文章

  1. 【world_to_pixel】【wcs_pix2world】世界坐标系和像素坐标系的两种转换方式
  2. html带表单和div的素材,用DIV+CSSwe标准布局网页表单的一个例子
  3. Android第二十课 解决Logcat无法输出调试信息
  4. OraclePLSQL 安装及乱码问题解决
  5. 【云计算】docker registry v2简介
  6. 表达式语言输出map
  7. ubuntu配置vsftpd记录
  8. 文件夹删除不掉怎么办?
  9. 我的博客也是男的(还好)
  10. 分类目录管理系统——软件开发项目实践