一个简单编译器的实现.doc

一个简单编译器的实现.doc

ID:59249688

大小:29.00 KB

页数:8页

时间:2020-09-08

一个简单编译器的实现.doc_第1页
一个简单编译器的实现.doc_第2页
一个简单编译器的实现.doc_第3页
一个简单编译器的实现.doc_第4页
一个简单编译器的实现.doc_第5页
资源描述:

《一个简单编译器的实现.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、基于flex与bison的一个简单编译器的研究与实践[摘要]编译是程序执行过程中一个重要的步骤,分为词法分析、语法分析、语义分析、中间代码生成、中间代码优化、机器代码生成、机器代码优化几个步骤。本文使用flex与bison工具,编写了简洁的代码,实现了对一个简单语言的简单程序的词法分析、语法分析,最后生成了相应的抽象语法树。得出了flex与bison是编写词法分析器和语法分析器的有效工具的结论。[关键词]编译抽象语法树词法语法程序目录摘要第一章绪论1.1为什么要用编译器1.2编译步骤第二章简单编译器的研究与实现2.1简单编译器的结构2.2词法分析2.3语法分析2

2、.4语义分析第三章实验结果全文总结第一章绪论1.1为什么要用编译器在计算机中,程序可以用不同的语言来编写,比如C,C++,汇编语言,机器代码等。计算机能够直接识别的只有机器代码,因此需要编译器来将其他语言编译成机器代码,或者将一种语言编译成另一种语言[1]。编译器是一个计算机程序(或一系列程序),它能将用程序语言写的源代码编译成计算机能够识别的目标代码,后者往往是二进制代码[2]。近年来基本的编译器设计都没多大的改变,而且它们正迅速地成为计算机科学课程中的中心一环。[5]1.2编译步骤1.2.1预处理一个较为复杂的程序可能被分割为多个模块,并存放于对应的源文件中

3、。预处理器是一个程序,它把源程序拼接在一起,并把宏转化为源语言的语句[3]。1.2.2词法分析经过预处理的源程序会作为输入传递给编译器,词法分析是编译的第一个步骤。词法分析器以字符流的形式读入源程序,将它们组织成有意义的单词(token)[3]。flex是一种词法分析工具,它基于lex做了改进,能够更快地生成C语言词法分析程序。1.2.3语法分析语法分析是编译的第二个步骤。在这个步骤中,根据语言的语法识别词法分析后得到的字符流,生成语法树。为了能够为应用程序提供清晰简洁的接口,隐藏复杂的底层信息,抽象语法树仅仅设计了有实际意义的节点。Bison是一种语法分析工具

4、,它基于YACC做了改进,能够自动生成C语言语法分析程序。第二章简单编译器的研究与实践2.1简单编译器的结构2.1.1编译器的功能本文将实现一个能将某些具有代表性的程序片段转换成三地址代码的编译器。例如:程序片段:a=1;b=10;While(a

5、本语言的终结符有标识符(以字母开头,可以包含字母或数字)、正整数、运算符、while关键字、符号。本语言的语法规则定义如下:program→stmt

6、programstmtstmt→while_stmt

7、assign_stmtwhile_stmt→WHILE(bool_expr)stmtassign_stmt→ID=expr;bool_stmt→expr>expr

8、expr

9、expr==exprexpr→primary_expr+expr

10、primary_expr-exprprimary_expr→ID

11、NUMBER每一条推导式中→代表“具有以下形式”

12、,左边是要定义的语法成分,右边是相应的词素构成,

13、表示或者,大写的单词表示终结符。2.1.3简单编译器的结构简单编译器包括词法分析程序、语法分析程序、符号表管理程序和中间代码生成程序。分别实现将字符流转化为单词符号流,用单词符号流构建抽象语法树,管理语法分析过程中向符号表中增改信息的功能。2.1.4程序编写和连接本文借助flex工具生成词法分析器,bison工具生成语法分析器,用C语言编写程序,所有程序在同一目录下,用gcc编译连接。2.2词法分析2.2.1为什么使用flex词法分析通常所做的就是在输入中寻找字符的模式(pattern),而一种简洁明了的模式的描

14、述方式就是正则表达式(regularexpression)。Flex会把所有的正则表达式翻译成一种高效的内部格式(确定性有穷自动机,DFA),使它几乎可以同时处理所有需要匹配的模式,因此它的速度可以成百倍地提高[4]。另外,flex版本的词法分析器比相应的手写的C代码更简短,因此也更容易调试。2.2.2flex代码及含义首先包括进由bison产生的头文件,其中有对关键字、终结符的枚举。然后将字符流组织成有意义的单词(token),再返回给yylex()函数。在yyparse()运行过程中会多次调用yylex()函数来获取单词(token)。%optionnoyy

15、wrapnodefaul

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。