- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
编译原理实验报告
课程名称: 编译原理
班级: 计算1614
实验成绩:
指导教师: 付永钢
姓名: 施心萍
实验项目名称:
实验一 词法分析程序设计与开发
学号: 201621121097
上机实践日期:
一、实验目的
?? 深入理解有限自动机及其应用
? 掌握词法分析程序的开发。
?? 掌握根据语言的词法规则构造识别其单词的有限自动机的方法
?? 深入理解词法分析程序自动生成原理
二、实验要求
? 掌握各类单词的形式描述
?用直接转向法实现有限自动机的代码编写。
? 独立完成PL0语言的词法分析器。
? 掌握词法分析程序自动生成工具LEX的使用。
三、实验原理
词法分析是编译过程的第一阶段。它的任务就是对输入的字符串形式的源程序按顺序进行扫描,根据源程序的词法规则识别具有独立意义的单词(符号),并输出与其等价的Token序列。
有限自动机是描述程序设计语言单词构成的工具,而状态转换图是有限自动机的比较直观的描述方法。我们使用确定的有限状态自动机,简记为DFA。
PL/0的语言的词法分析器将要完成以下工作:
(1) 跳过分隔符(如空格,回车,制表符);
(2) 识别诸如begin,end,if,while等保留字;
(3) 识别非保留字的一般标识符,此标识符值(字符序列)赋给全局量id,而全局量sym赋值为SYM_IDENTIFIER。
(4) 识别数字序列,当前值赋给全局量NUM,sym则置为SYM_NUMBER;
(5) 识别:=,=,=之类的特殊符号,全局量sym则分别被赋值为SYM_BECOMES,SYM_LEQ,SYM_GEQ等。
相关过程(函数)有getsym(),getch(),其中getch()为获取单个字符的过程,除此之外,它还完成:
(1) 识别且跳过行结束符;
(2) 将输入源文件复写到输出文件;
(3) 产生一份程序列表,输出相应行号或指令计数器的值。
下面给出能够识别PL0语言中各类单词的DFA:
根据语言的词法规则构造出识别其单词的确定有限自动机DFA, 仅仅是词法分析程序的一个形式模型,距离词法分析程序的真正实现还有一定的距离。状态转换图的程序实现通常是采用直接转向法。
直接转向法又称为程序中心法,是把状态转换图看成一个流程图,从状态转换图的初态开始,对它的每一个状态结点都编写一段相应的程序。
四、实验步骤
构造识别单词的自动机
1.根据给定的词法构成规则对程序语言的单词按类构造出相应的状态转换图,并根据具体需求对该状态转换图进行完善。
2. 对各类单词的状态转换图合并,构成一个能识别语言所有单词的状态转换图。合并步骤为:
(1) 将各类单词的状态转换图的初始状态合并为一个唯一的初态;
(2) 化简调整状态冲突和对冲突状态重新编号;
(3) 对上述形成的状态图进行修正,以满足识别合适单词的要求。
(4) 如有必要,在合适的位置增加出错状态。
用直接转向法实现有限自动机的代码,生成对应的词法分析程序。要严格按照给出的DFA,对每个状态编写对应的识别代码,然后对每个状态的代码用合适的分支、循环等语句进行整合,完成整个代码的合成工作,并上机进行调试。对实现的代码进行测试,给出合适的测试用例(要求至少有3个用例,二个正确识别所有的保留字、标识符、分界符、数字等;另外一个识别错误的单词。
样例1
输入
输出 生成的txt程序列表
样例2
输入(部分)
输出(部分)
生成的txt程序列表(部分)
样例3(小数)
用自动生成工具LEX生成上述给定DFA所对应的PL0语言的词法分析程序。并进行调试,用上述3个测试用例进行测试,给出测试结果。
编写LEX文件
运用flex生成lex.yy.c文件
运行结果
样例1
样例2(部分)
样例3(小数)
五、实验小结
FLEX通过对LEX源文件的扫描自动生成相应的语法分析函数,生成lex.yy.c程序。LEX具有“最长匹配原则”和“最先匹配原则”,能够使用简洁的正规表达式去实现语法分析程序,而且lex.yy.c中定义了很多用户可定义的全局变量以及在LEX源文件的动作中可调用的函数和宏,具有良好的可移植性。但是LEX对源文件的格式要求非常严格,而且LEX本身的查错能力很弱,所以书写时一定要特别注意。
C语言提供大量的函数,其中包括系统生成的函数和用户定义的函数,语法也很容易理解,使用C语言实现语法分析程序可以较好地掌握程序的分支和流程,但是代码量很多,容易出现错误,书写的时候需要特别细心。
实验的处理单词集(仅供参考)
(注:单词种类统一分类如下:)
单词符号 单词种类
空 0
标识符 1
整数 2
+
文档评论(0)