- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
计算机专业类课程
实验报告 课程名称:编译原理
学 院:计算机科学与工程
专 业:计算机科学与技术
学生姓名:林怡
学 号:2012060020023
指导教师:陈昆 日 期: 2015年6月5日 电 子 科 技 大 学
实 验 报 告
实验一
实验名称:词法分析器的设计与实现
实验学时:4
实验内容和目的:
实验内容:
求n!的极小语言的源程序作为词法分析的输入程序,根据给定的文法对其进行词法分析并将单词符号与种别组成的二元式按指定格式输出到out.dyd文件中,同时将词法错误输出到error.err文件中。
其中二元式文件out.dyd 有如下要求:
(1)二元式形式:
单词符号(种别
(2)每行后加上
“(((...(EOLN(24”
(3)文件结尾加上
“(((...(EOF(25”
出错文件error.err中错误信息格式如下:
***LINE:行号((错误性质
实验目的:
通过设计并实现一个词法分析器,了解和掌握词法分析程序设计的原理及相应的程序设计方法,同时提高编程能力。
实验原理:
1、编译程序要求对高级语言编写的源程序进行分析和合成,生成目标程序。词法分析是对源程序进行的首次分析,实现词法分析的程序为词法分析程序。像用自然语言书写的文章一样,源程序是由一系列的句子组成的,句子是由单词符号按一定的规则构成的,而单词符号又是由字符按一定规则构成,因此,源程序实际上是由满足程序语言规范的字符按照一定的规则组合起来构成的一个字符串。
2、词法分析的功能是从左到右逐个地扫描源程序字符串,按照词法规则识别出
单词符号作为输出,对识别过程中发现的词法错误,输出相关信息。
3、单词符号是程序语言最基本的语法符号,为便于语法分析,通常将单词符号分为五类(标识符,基本字,常数,运算符,界符),而本次实验中单词符号与其对应的种别如下图所示:
4、状态转换图是有限有向图,是设计词法分析器的有效工具。图中的节点代表状态,节点间的有向边代表状态之间的转换关系,有向边上标记的字符表示状态转换的条件。本实验中的状态转换图如下图所示:
5、本程序所设计主要方法及作用如下:
① int isletter(char c) 判别字符c是否为字母
② int isdigital(char c) 判别字符c是否为数字
③ int match_reserve(char *p) 匹配字符串p是否为保留字
④ void match_symbol(const char *p) 匹配字符串p是否为标识符
⑤ void match_double_operator(char *p) 匹配字符串p是否为双运算符
⑥ void match_single_operator(char *p) 匹配字符串p是否为单运算符
⑦ void outfile() 将词法分析所得的二元式按固定格式写入文件out.dyd
实验器材(设备、元器件)
C语言+windows7+CodeBlocks+gcc
实验步骤:
1、将源程序保存到in.pas文件中;
2、从in.pas文件中读取字符串保存到buf数组,若整个输入文件已读取完毕,程序结束;
3、每次从buf数组中读入一个字符,若已读到buf最后一个字符,返回第2步继续执行;
3-a 如果该字符是字母或数字将其连接到temp字符串尾部,buf索引index加1,判断buf[index]是否为0,若为0说明temp字符串为一完整单词,跳到第4步执行;若不为0,继续执行第3步;
3-b 如果读入的不是字母/数字,首先判断并匹配temp中是否已出现保留字/标识符,如果没有,通过预读buf中的下一个字符来进一步判断temp中存放的是单运算符还是双运算符或换行符,最终写入相应二元式,返回第3步继续执行;
4、判断temp字符串是否为保留字,若不是保留字,进一步判断它是标识符还是常量,最终生成相应二元式,返回第3步继续执行;
【注】 这里省略了对于非法字符的出错处理
实验数据及结果分析:
测试程序如图,在测试程序中故意添加了一些词法错误如:将保留字写成beg in,常数1kkk,符号 !=,用于检测本实验程序的查错能力;
程序运行完毕,得到out.dyd文件,内容如图所示:
报错文件error.err内容如图:
由上图可以看出,本词法分析程序,可以识别部分非法的常数以及字母表以外的非法字符,但对于将begin写成beg in这一类的词法错误,并未做处理,而是将其放到语法分析的部分来处理。
实验结论、心得体会和改进建
文档评论(0)