[flex & bison]编译器杂谈
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]编译器杂谈的更多相关文章
- 编译器工具 Flex Bison for Windows 简单入门例子
最近从事一个系统仿真软件的开发,里面定义了自己的描述性语言MSL, MSL语言经FlexBison转换成C语言,然后用C编译器来编译并计算仿真. 现在领域驱动开发比较热门,有机会定义自己的语言对程序员 ...
- OpenCASCADE Expression Interpreter by Flex & Bison
OpenCASCADE Expression Interpreter by Flex & Bison eryar@163.com Abstract. OpenCASCADE provide d ...
- Flex & Bison 开始
Flex 与 Bison 是为编译器和解释器的编程人员特别设计的工具: Flex 用于词法分析(lexical analysis,或称 scanning),把输入分割成一个个有意义的词块,称为记号(t ...
- Windows下 flex + bison 小例子
.下载flex和bison,网址是http://gnuwin32.sourceforge.net/packages/flex.htm 和http://gnuwin32.sourceforge.net/ ...
- 应注意的Flex&Bison潜规则
1.Flex的二义性模式 语法分析器匹配输入时匹配尽可能多的字符串 如果两个模式都可以匹配的话,匹配在程序中更早出的模式. 针对这一点的理解,在语法分析文件当中,token的识别,应从特殊到一般的过程 ...
- flex&bison 1
. {ECHO;}-----单独的flex使用中有效 . { yyerror();}--------flex和bison交叉使用,即使不调用yyerror函数,也会报错的 error: syn ...
- flex/bison 计算器
flex %{ #include <stdio.h> #include "mycalc.tab.h" ;} %} %% "+" return ADD ...
- lex yacc flex bison
lex与yacc是两个在Unix下的分别作词法分析和语法分析的工具, Linux对应flex与bison. windows:http://sourceforge.net/projects/unxuti ...
- flex bison
https://www.gnu.org/software/bison/manual/bison.html https://blog.csdn.net/sirouni2003/article/detai ...
随机推荐
- ie11只能用管理员身份打开解决办法
解决IE11只能用管理员身份运行的问题 不知道大家有没有遇到这种情况,在毫不知情的情况下 IE11 突然打不开了,必须要用管理员身份运行才可以打开,而且重置浏览器这个方法也不奏效. 今天本人也遇到了, ...
- qt 程序启动参数 -qws
运行嵌入式程序 在嵌入式QT版本中,程序需要服务器或自己作为服务器程序.服务器程序构造的方法是构造一个QApplication::GuiServe类型的QApplication对象.或者使用-qws命 ...
- [置顶] UNIX常用命令
scp命令用于两个机器之前文件的拷贝 scp 被拷贝文件 远程机器用户名@远程机器IP:拷贝目的目录或者拷贝目录下的目的文件 dos2unix 在执行编译文件时,本来应该生成可执行文件a,但是执行完后 ...
- 微信支付bug
1.最基本的操作就是检查各项参数正确2.确保将测试微信号加入测试白名单 3.目录正确:发起授权请求的页面必须是在授权目录下的页面,而不能是存在与子目录中.否则会返回错误,Android返回“Syste ...
- Java基础知识强化之IO流笔记10:File类输出指定目录下指定后缀名的文件名称案例(File类的文件过滤器方法改进list( FilenameFilter ff))
1. 案例: 判断F盘下是否有后缀名为.jpg的文件,如果有的话,就输出这个文件名. 2. 案例代码如下: (1)思路是:先获取所有的文件和文件夹封装的对象,然后遍历的时候,依次判断,如果满足条件就输 ...
- 使用CSS、JS的几种方法
引用CSS到html网页里的4种方法 1.行内式 在标记的style属性中设定CSS样式,这种方式本质上没有体现出CSS的优势,因此不推荐使用 <div style="widt ...
- python3下的super()
大家都知道super是用来解决python钻石多重继承出现的基类重复调用的问题,这个就不赘述了,不了解的请点击. 但是我发现还有个问题在于不是钻石继承时继承先后顺序的问题,也就是如果mixin与继承的 ...
- Linq101-QueryExecution
using System; using System.Linq; namespace Linq101 { class QueryExecution { /// <summary> /// ...
- C# WebService 基础实例
1.整个Demo结构:如下图: 2.新建项目--选择asp.net web服务应用程序TestWebService 3.重新命名Service1.asmx为MyService.asmx 4.右键MyS ...
- WMI使用集锦
转载:http://singlepine.cnblogs.com/articles/299457.html 1.WMI简介 WMI是英文Windows Management Instrumentati ...