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. 从XML文件乱码问题,探寻其背后的原理

    出现应用程序读取XML文件乱码的场景: 加入xml文件以<?xml version="1.0" encoding="utf-8" ?> 格式的:如果 ...

  2. POJ 3414 Pots ( BFS , 打印路径 )

    题意: 给你两个空瓶子,只有三种操作 一.把一个瓶子灌满 二.把一个瓶子清空 三.把一个瓶子里面的水灌到另一个瓶子里面去(倒满之后要是还存在水那就依然在那个瓶子里面,或者被灌的瓶子有可能没满) 思路: ...

  3. poj2586 Y2K Accounting Bug(贪心)

    转载请注明出处:http://blog.csdn.net/u012860063?viewmode=contents 题目链接:http://poj.org/problem?id=2586 ------ ...

  4. 妹子图太多怎么看才好,Swing来支招

    近期事少,翻开非常久曾经写的小程序,创意倒是尚可,代码写的却比較基础,非常多东西没有实现,略改了改形成了如今的模样,如今大家都忙着大数据,中间件,web开发,偶尔看看Java Swing的作品,也许能 ...

  5. spring注入成员对象

    就是将对象注入到另外一个对象中.这个样例就是有一个学校类,学校类中有一个校长类,最后使用測试文件输出学校类中的信息. 代码结构 学校类 package com.test.SpringGetSet; p ...

  6. u盘安装linux(windows7+linux双系统)

    前提条件:1.先装windows7,后装linux系统 2.windows7 里有“未分区的空间”(不是C:,D:,E:) :计算机→管理→存储空间,删除一些压缩卷即可. 3.下载ultraiso → ...

  7. [转] Linux下查看文件和文件夹大小

    当磁盘大小超过标准时会有报警提示,这时如果掌握df和du命令是非常明智的选择. df可以查看一级文件夹大小.使用比例.档案系统及其挂入点,但对文件却无能为力.    du可以查看文件及文件夹的大小. ...

  8. 案例:我行我素购物系统 v1.1

    系统逻辑结构: import java.util.Scanner; public class ShoppingSystem { public static void main(String[] arg ...

  9. Ubuntu上glibc CVE-2015-7547漏洞的POC验证和修复

    Ubuntu上查看Glibc版本 $ldd --version ldd (Ubuntu GLIBC 2.21-0ubuntu4) 2.21 Ubuntu上查看使用Glibc的相关程序 sudo lso ...

  10. 将datagrid中数据导出到excel中 -------<<工作日志2014-6-6>>

    前台datagrid数据绑定 #region 导出到excel中    /// <summary>    /// 2014-6-6    /// </summary>    / ...