在VisualC集成开发环境下应用flex和bison开发编译器

上传人:壹****1 文档编号:490369849 上传时间:2022-10-01 格式:DOC 页数:4 大小:163.50KB
返回 下载 相关 举报
在VisualC集成开发环境下应用flex和bison开发编译器_第1页
第1页 / 共4页
在VisualC集成开发环境下应用flex和bison开发编译器_第2页
第2页 / 共4页
在VisualC集成开发环境下应用flex和bison开发编译器_第3页
第3页 / 共4页
在VisualC集成开发环境下应用flex和bison开发编译器_第4页
第4页 / 共4页
亲,该文档总共4页,全部预览完了,如果喜欢就下载吧!
资源描述

《在VisualC集成开发环境下应用flex和bison开发编译器》由会员分享,可在线阅读,更多相关《在VisualC集成开发环境下应用flex和bison开发编译器(4页珍藏版)》请在金锄头文库上搜索。

1、论文与报告战木导禅枚制牧术2004 年 No.4(总 47 期)论文与报告2004年No4(总47期)-65-论文与报告战木导禅枚制牧术2004 年 No.4(总 47 期)-65-论文与报告战木导禅枚制牧术2004 年 No.4(总 47 期)在Visual C+集成开发环境下应用flex和bison开发编译器熊伟戴果国防科技大学电子科学与工程学院,湖南长沙410073摘要 flex和bison是两种非常重要的、功能强大的语肓工具。熟练掌握flex和bison可 以很方便地创建某种应用开发所需语盲的编译器。本文介绍了在windows操作系统中,应用Visual C+集成开发环境和语言工具fl

2、ex、bison开发编译器的基本方法,并设计了一个应用实例。关键词 编译器 集成开发环境flex bison Visual C+ WindowsCompiler Development with Flex and Bison in Visual C+ IDEXiong Wei, Dai GuoSchool of ESE, National University of Defense Technology, Changsha 410073, ChinaAbstract: Flex and bison are powerful tools for compiler development. We

3、introduce a method for compiler development with flex and bison in Visual C+ IDE. At last an example is presented. Keywords: Compiler, IDE, Flex, Bison, Visual C卄,Windows-65-论文与报告战木导禅枚制牧术2004 年 No.4(总 47 期)-65-论文与报告战木导禅枚制牧术2004 年 No.4(总 47 期)糕 伟:(1976年),男,国防科技大学电子科学与工程学院405教研室DBRG组2001级博士研究生;研究方向:地理

4、信 恵系统与数据库技术o E-mail:641 flex和bison的简介一般语言的编译程序在处理语言时,通常分 为词法分析和语法分析两个阶段。词法分析阶段 识别低级对象如数、操作符及特殊符号;语法分 析阶段识别高级对象,如程序设计语言中的语 句叫无论是词法分析还是语法分析程序,用手 工去编写都是十分繁琐的。因此在UNIX系统 中,都提供了 lex (lexical analyzer)和 yacc(Yet another Compiler Compiler)131 等软件工具。使用 这些工具,不仅可以大大地简化词法分析和语法 分析程序的开发工作,还可以帮助用户完成许多 其它任务。GNU (Gn

5、s Not UNIX)是自由软 件基金会的工程,主要工作是创建开放源码的类 UNIX操作系统及其应用软件。GNU工程的lex 和yacc的替换版本为flex和bison,同时这个版 本也可以在Win32平台上与Visual C+相结合使 用。2 flex和bison源程序的格式flex程序分为三个段:第一段是C和flex的 全局声明,第二段包括规则(C代码),第三段 是补充的C函数。例如,第三段中一般都有main 0函数。这些段以%来分界。flex源程序结构 是: 定义段 规则段和子程序段定义 段的内容主要包括C语言说明:括在 和 %)之间的内容为C语言说明,所有C语言的说 明语句和预处理语句

6、都可以放在这一部分中, flex将把 和%)之间的内容不加改变地抄写 到它所生成的词法分析程序之中去。标识符定 义:flex用标识符给某些重复出现次数较多的正 则表达式命名,而在需要使用它们的地方代之以 相应的标识符。开始状态说明:在flex中提供了 一种称为开始状态的机制,以解决左文相关问 题。规则段中每一条规则都可分为正则表达 式部分和C程序或动作部分。当输入流中出现 与正则表达式相匹配的字符串时,就执行后而的 动作。为了便于描述词法分析程序的动作,flex 还提供了许多变最、子程序和宏替换供用户使 用,详细可以参见用户手册。在子程序段, 可以定义词法分析程序所需的各类过程和函数, 比如主

7、程序main。或函数yywrapOo子程序段里 的内容由flex原封不动复制到它所生成的词法分 析程序里面。bison源程序结构也由说明段、规则段 和 子程序段三部分组成。规则段由一条或多条规则所组成,不包 含任何规则的 规则段是不合法的。每条规则 以分号结尾。在逻辑上一条规则可分为两部分, 一部分是一条巴科斯范式(BNF),另部分是 一段C程济,琢为一个动作。当从词法分析程 序得来的单词序列可按某个BNF进行归约时, 就可执行与该BNF相对应的动作。说明段中 的说明有两类:一类是C程序说明;另类是 bison说明。C程序说明必须用配对的% (和 %)括在一起,它们将原封不动地复制到bison

8、 所生成的语法分析程序之中去。bison说明有多 种,关键字%token的作用是说明终结符,没有 在%token语句中出现的标识符都被认为是非终 结符,每个非终结符必须至少在产生式的左部出 现一次。在所有非终结符中,描述最一般结构的 产生式左部非终结符,被称为开始符 right. %left和%nonassoc的作用是说明算符的结 合性,以解决语法的二义性问题。在子程序 段里,用户可以自己所需的各种子程序,比如 说错误处理程序yyerrorOo子程序中的内容都会 被bison如实地复制到bison所生成的语法分析 程序之中去。3 Visual C+集成开发环境下应用flex和bison编程的基

9、本方法3.1基本步骤在用flex和bison开发语言处理程序时,用 户先编写一个flex源程序和一个bison源程序。 flex、bison和CC+是强耦合的,flex源程序经 flex处理后,在文件lex.yy.c中生成一个用C语 言描述的词法分析子程序yylex 0文件lex.yy.c 再经C编译器编译,就可以得到能与其它模块 链接的目标文件lex.yy.o或可直接运行的命今文 件。bison源程序经bison处理后可在文件y.tab.c 中得到一个用C语言描述的语法分析子程序yy- pae Oo文件y.tab.c再经C编译器编译,就可以 得到能与其它模块链接的目标文件y.tab.o或可

10、直接运行的命令文件。flex和bison对源程序文 件的名字没有特殊要求,但以作为flex源文件 的扩展名,以J作为bison的扩展名是一个良好 的习惯。flex编程可以分为三步:Step:编写词法分 析文件,以flex可以理解的格式指定模式相关的 动作。Step2:在这一文件上运行flex,生成扫描 器的C代码。Step3:编译和链接C代码,生成 可执行的扫描器。注意:如果扫描器是用bison开发的解析器 的一部分,只需要进行第一步和第二步。用bison来创建一个编译器包括四个步骤:Step!:编写一个.y的语法文件(同时说明C 在这里要进行的动作);编写一个词法分析器来 处理输人,并将标记

11、传递给解析器。这通常可以 使用flex来完成。编写一个函数,通过调用yy parse 0来开始解析。编写错误处理例程(如yy error()o Step2:通过在语法文件匕运行bison生 成一个解析器。Step3:编译bison生成的代码以 及其他相关的源文件。Step4:将目标文件链接 到适当的可执行解析器库。图1给岀了 flex和bison产生语言处理程序 的过程。3.2 flex和bison之间的接口如果要用flex所生成的词法分析程序和bison 生成的语法分析程序共同组成一个完整的语 言处理系统,那么,要使它们的函数名、参数和 返回值相一致。由于bison所生成的语法分析程 序yy

12、parseO诡用的词法分析程序与Hex所生成的 程序都叫yylexO,所以函数名上是相吻合的,不 存在矛盾。而且因yylex。是无参函数,也不存在 参数传递问题,语法分析程序yyparseQ要求词法-65-论文与报告我求耳禅拉制枝木2004 年 No.4(总 47 期)分析程序为它返回单词的编码。Ilex源程序flexC编译程序|C编译程序被器沪4词法分*程刚严肝飜蠶语法错渓|语法锈谋图I flex和boson产生语言处理程序的过程flex源程序中,同一个单词在词法分析程序 和语法分析程序中必须代表相同的值。在bison 所生成的文件y.tab.c中,每一个终结符、标识 符都被用#define

13、语句定义为一个整数,这个整 数的值就是该终结符的编码。第一个出现在bi son源程序的% token说明中的终结符的编码为 257,其余终结符的编码按照它们在%token说明 中出现的次序依次增加。文字型终结符以它们的 ASCII码值0-255作为自身的单词编码。yylval 是一个由bison负责进行定义的变最,不必在源 程序中进行说明。但如果需要重新定义,就需要 在y文件中说明段指出。4应用实例下面来看一个完整的实例。在这个例子中, 我们实现了具有四则运算、简单函数计算功能, 如:求对数和平方根的一个计算器的编译器。主要 的数据结构包括采用数组实现的符号表(我们假 设符号表的最大容僦为20

14、个)。定义如图2所示。对于符号表的操作包括符号表查找,向符号 表中添加符号,具体实现代码如图3所示。利用 符号表还可以方便地对计算函数的功能进一步扩 展,具体实现代码如图2。词法文件scan主要代码如图4。语法文件gram.y主要代码如图6, main函 数见图5。在这里省略了相关的函数和于程序的代码。 首先利用flex和bison编译生成scan.cx gram.h. gram.c文件。成功执行后情况如图7所示。具体 的命令参数可以参考相关手册叫然后在Visual C+中创建一个空的Win32 控制台应用程序工程calculator.dsw后,将上述 文件加入工程,并将符号表结构写入calc

15、ulator.h 文件也加人工程。利用Visual C卄编译成功后, 程序执行结果如图8所示:#define NSYMS 20/袴号表的最大容量*/struct symlab( char #name;double (*funcptr)0; double value;)symtab(NSYMS;/J扩展计算函数的代码V addfunc(char *namef double *funcX) struct symtab *sp=symlook(name);sp-funcptr=func;图2符号表结构struct symtab symlook(char *s)struct symtab *sp;for(sp=symtab; spname & ! strcmp(sp-namet s) return sp;if(!sp-name)/*如果没找到则加人符号表/ sp-name=strdup(s);return sp;/#否则査找下一个拿/)yye

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 医学/心理学 > 基础医学

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号