flex与bison是编译器设计工具。这里的编译器为广义,其中包括一般的编译器、脚本解析器等,需要进行语言结构解析来得出意义的程序。

  当我们需要用一个语言来设计一款编译器时,需要考虑太多设计重心外的东西,如内存管理、模块设计、字符识别等,flex与bison就很好地为我们处理了这些事情,将设计重心放在词法与语法分析上。

  flex提供词法分析,采用的是正则表达式匹配字符。

  bison提供语法分析,采用A : B | C ;的方式进行语法设计。

  具体的规则《flex 与 bison》有很详细的描述。

  

  首先,对于语言的解析,是以流(stream)的方式进行的。

  假定我们词法与语法都已经设定好

  if A > B then C = 0;

  对于以上句子大概会进行如此解析:

  1. if 词法分析判定为 IF,返回标记

  2. 语法分析接到标记,存放到栈内,发现找不到适合的语法来进行归约,返回进行词法分析

  3. A 词法分析判定为NAME,返回标记

  4. 语法分析接到标记,存放到栈内发现NAME能被归约成exp,NAME出栈,exp入栈

  5. 现在栈内有IF exp,语法分析发现找不到适合的语法来进行归约,返回进行词法分析

  6. > 词法分析判定为CMP,返回标记

  7. 语法分析接到标记,存放到栈内,发现找不到适合的语法来进行归约,返回进行词法分析

  8. B 词法分析判定为NAME,返回标记

  9. 语法分析接到标记,存放到栈内发现NAME能被归约成exp,NAME出栈,exp入栈

  10.语法分析接到标记,存放到栈内,发现栈内有exp CMP exp,可以规约为exp,于是进行归约,exp放回栈内,然后发现有IF exp,无法归约,返回词法分析

  ...

  *分析方法采用的是lrlr(1),这也是bison的一般做法,上面分析为了方便省去向前查看的步骤。

  上述例子可以看出只要过一遍字符流,通过词法分析与语法分析的交替进行,就可以最终归约句子。

  

  为了方便维护,语法分析时都会进行语法树构建,如上述例子:

  当NAME被归约成exp时,创建节点,节点需要保存NAME所在符号表的位置,

  当exp CMP exp被归约成exp时,创建节点,节点需要保存作exp节点的指针为左子树,保持右exp节点的指针为右子树,保存CMP类型

  一般的编译器都能够自定义变量,如上述例子的A、B、C,这些符号会在词法分析时被判别为自定义变量。

  自定义变量需要进行维护,可以用哈希表保存自定义变量。

  自定义变量的名称在词法分析时,就可以加到哈希表内。

  另外自定义变量包含比较多的信息,如类型、变量值等,如果是函数,那么还会包含函数体指针,这些在词法分析时是无法得到的。而在词法分析时,只是构建语法树,并不适于进行信息填充。但是在计算时就会用到哈希表内的变量。

  假设句子是一行一行执行的,那么在碰到'\n'符合时就会执行计算,

  如上例:C = 0;

  计算时会把C在哈希表内的变量值填充为0;

  

[flex & bison]编译器杂谈的更多相关文章

  1. 编译器工具 Flex Bison for Windows 简单入门例子

    最近从事一个系统仿真软件的开发,里面定义了自己的描述性语言MSL, MSL语言经FlexBison转换成C语言,然后用C编译器来编译并计算仿真. 现在领域驱动开发比较热门,有机会定义自己的语言对程序员 ...

  2. OpenCASCADE Expression Interpreter by Flex & Bison

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

  3. Flex & Bison 开始

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

  4. Windows下 flex + bison 小例子

    .下载flex和bison,网址是http://gnuwin32.sourceforge.net/packages/flex.htm 和http://gnuwin32.sourceforge.net/ ...

  5. 应注意的Flex&Bison潜规则

    1.Flex的二义性模式 语法分析器匹配输入时匹配尽可能多的字符串 如果两个模式都可以匹配的话,匹配在程序中更早出的模式. 针对这一点的理解,在语法分析文件当中,token的识别,应从特殊到一般的过程 ...

  6. flex&bison 1

    .   {ECHO;}-----单独的flex使用中有效 .   { yyerror();}--------flex和bison交叉使用,即使不调用yyerror函数,也会报错的 error: syn ...

  7. flex/bison 计算器

    flex %{ #include <stdio.h> #include "mycalc.tab.h" ;} %} %% "+" return ADD ...

  8. lex yacc flex bison

    lex与yacc是两个在Unix下的分别作词法分析和语法分析的工具, Linux对应flex与bison. windows:http://sourceforge.net/projects/unxuti ...

  9. flex bison

    https://www.gnu.org/software/bison/manual/bison.html https://blog.csdn.net/sirouni2003/article/detai ...

随机推荐

  1. STM8S 独立看门狗配置及使用

    //独立看门口的时钟来源 内部低速时钟 128khz 除以2 即64khz //选择 IWDG_Prescaler_128 //64/128 =0.5 khz 2ms周期 #define IWDG_5 ...

  2. [每日一题] OCP1z0-047 :2013-08-14 如何理解USING INDEX?...................................41

    正确答案:B 一.USING INDEX的实验: .USING INDEX可以让你在创建主键.唯一性约束的时候使用指定的索引或创建索引.或修改索引的存储结构. OK,我先不用USING INDEX,创 ...

  3. LVS图解 ---阿里

    LVS在大规模网络环境中的应用   1. SLB总体架构   LVS本身是开源的,我们对它进行了多方面的改进,并且也已开源-https://github.com/alibaba/LVS.     接下 ...

  4. Core Foundation框架介绍

    Core Foundation框架介绍 **参考网址: ARC下OC对象和CF对象之间的桥接 Core Foundation框架介绍 Core Foundation框架 Core Foundation ...

  5. 浅谈Android架构之MVP,MVVM

    概述 MVP(Model-View-Presenter)是传统MVC(Model-View-Controller)在Android开发上的一种变种.进化模式.主要用来隔离UI.UI逻辑和业务逻辑.数据 ...

  6. jquery的ajax方法:ajaxStart()和ajaxStop()

    ajaxStart()方法: 当AJAX请求开始时,显示加载中的提示. $("#divMessage").ajaxStart(function(){ $(this).show(); ...

  7. XML样本(格式没区别,但是一个有结果 一个没结果)

    xml样本01<orderlist>        <order>        <orderid>1</orderid>        <ord ...

  8. Delphi PChar与String互转

    1.String转化成PChar 例: var str: string; pStr:PChar; ... pStr := PChar(str); 2.PChar转String 例: var pStr: ...

  9. SOA与EBS集成_Package 调用维护

    介绍SOA Suite与EBS集成成,使用PACKAGE调用集成的组合程序的运维方法: 1.打开组合程序,在oracle adapter上右键,选择edit,在配置向导中跳转到第五步,确认组合程序调用 ...

  10. 读取url(1

    就书本例子 import java.io.InputStream; import java.net.URL; public class Test { public static void main(S ...