基于FlexBison的高级解释器设计及实现

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

课程设计3 基于Flex/Bison的高级解释器设计及实现

3.1 需求分析

3.1.1 问题定义

1.使用flex和bison开发了一个具有全部功能的桌面计算器,能够支持变量,

过程,循环和条件表达式,使它成为一个虽然短小但是具有现实意义的编译器。

2.重点学习抽象语法树的用法,它具有强大而简单的数据结构来表示分析。

3.1.2 功能描述

1.计算器具体需要实现的功能:

a)变量命名;

b)实现赋值功能;

c)实现比较表达式(大于、小于、等于等等)

d)实现if/then/else和do/while的流程控制;

e)用户可以自定义函数;

f) 简单的错误恢复机制。

2. 编写 Flex/Bison源文件,实现C 语言的语法分析功能,最后上机调试。

3. 要求编写一个测试程序:

首先自定义两个函数sq和avg,sq函数使用Newton方法来迭代计算平方根;avg函数计算两个数值的平均值。

利用定义好的函数进行计算,得到计算结果并显示出来。

4.根据习题1的要求,修改fb3-2相关代码;

实现实现以下自定义函数,并保存为fb3-3。

函数示例:

let sq(n){e=1; while (|((t=n/e)-e)>.001) do {e=avg(e,t);}}

let avg(a,b){(a+b)/2;}

let max(a,b) { if(a>b) then a; else b; }

let max3(a,b,c) { if(a>b) then { if(a>c) then a; else c; }

else { if(b>c) then b; else c; } }

3.1.3 开发环境及工具介绍

1、Window环境下载Visual Studio之后,利用其命令提示窗口进行操作。下载并安装Flex。

2、vs2010的编译器cl.exe。

3、flex:词法分析器

Flex是用来生成程序的工具,他们所生成的程序能够处理结构化输入,最初的Flex是用来生成编译器的,但是后来他们被证明在其他领域也非常有效。Flex是一个SourceForge项目。其依赖于GNU m4宏处理器。Linux和BSD都应该有m4,对于Windos用户来说,Flex被包含在Cygein Linux模拟环境中。

什么是FLEX?它是一个自动化工具,可以按照定义好的规则自动生成一个C 函数yylex(),也成为扫描器(Scanner)。这个C函数把文本串作为输入,按照定义好的规则分析文本串中的字符,找到符合规则的一些字符序列后,就执行在规则中定义好的动作(Action)。例如在规则中可以这样定义:如果遇到一个换行字符\n,那么就把行计数器的值加一。Flex文件就是一个文本文件,内容包括定义好的一系列词法规则。

4、bison:语法分析器

GNU bison 是属于 GNU 项目的一个语法分析器生成器。Bison 把一个关于“向前查看从左到右最右”(LALR) 上下文无关文法的描述转化成可以分析该文法的 C 或 C++ 程序。它也可以为二义文法生成“通用的从左到右最右”(GLR)语法分析器。

Bison是一种通用目的的分析器生成器。它将LALR(1)上下文无关文法的描述转化成分析该文法的C程序。一旦你精通Bison,你可以用它生成从简单的桌面计算器到复杂的程序设计语言等等许多语言的分析器。

Bison 基本上与 Yacc 兼容,并且在 Yacc 之上进行了改进。它经常和Flex (一个自动的词法分析器生成器)一起使用。

此软件的源代码是可自由获得的,在 GPL 下发布。

3.2 系统概要设计

3.2.1 系统体系结构

本实验计算器系统是基于抽象语法树的改进的计算器,在fb3-3.h 的文件中

实现声明部分,在fb3-3.l 文件中实现计算器对应的词法分析,在fb3-3.y 文件实现计算器的语法语义分析部分,在fb3-3funcs.c 文件对应的是相应的计算器的C 语言的代码。之后利用Visual Studio 命令提示实现计算器的功能。结构图如下:

声明部分计算器词法分析语法语义分析C 语言代码fb3-3.funcs.c

fb3-3.y

fb3-3.l

fb3-3.h

图3-1 系统体系结构图

计算器系统流程图:

开始

计算式

词法分析器读取

标识符

语法分析器处理

判断节点类型

建立相应节点

求值

输出结果

释放

结束

图3-2 系统流程图

3.2.2 系统模块划分

(1)fb3-3.h文件头声明部分

我们要做开始声明部分,在.h 头文件中我们可以用以下语句来定义抽象语法树的struct ast {int nodetype;struct ast *l;struct ast *r;}; 且所有

节点都有公共的初始 nodetype。而删除和释放抽象语法树可以用语句 void treefree(struct ast *)来实现即可。常量使用 numval,符号引用使用 symref 赋值使用 symasgn,它有一个指向被赋值符号的指针和使用抽象语法树表示的值;

(2)fb3-3.l文件词法分析部分

词法分析器中设计六个比较操作符都返回一个带有字面值以便于区分的CMP 记号,其中这六个关键字和四个内置函数通过文字模式加以识别,它们放在通用模式之前以便于在通用模式之前进行匹配;利用符号表进行词法分析,其中符号表中记录输入中使用的名称以及常用的符号。在这部分需要注意与C语言的交叉使用,对于每一类的词法分析须严格按照正则表达式来实现。

(3)fb3-3.y文件语法分析部分

语法分析器的设计,其中在语法分析器的最后提供了小部分错误恢复机制,这让我们有可能在错误发生时把语法分析器恢复到可以继续工作的状态;在这一部分我们为每个表达式建立了抽象语法树,以抽象语法树为单位进行计算,并打印出结果,并释放语法树。在这一部分需考虑移进/规约冲突和操作符的优先级,一定要在此代码中区分语句(stmt)和表达式(exp)。

(4)fb3-3funcs.c文件C语言代码部分

在这一部分的文件中语法分析器及.y文件需要调用其中的函数,创建语法树节点、分配节点进行填充、遍历抽象语法树。最后还要加一个辅助函数,正如《flex 与 bison》中所讲的一样,例程 treefree 的扩展版本会递归的遍历一颗抽象语法树并释放这棵树的所有节点。本计算器的核心例程是 eval,它用来计算分析器中构造的抽象语法树。我们采用深度优先遍历算法来计算表达式的值;

相关文档
最新文档