编译原理 实验 词法分析器的设计.docVIP

编译原理 实验 词法分析器的设计.doc

  1. 1、本文档共13页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
数学与信息工程学院 《编译原理》 实验报告一 实验名称:词法分析 实 验 室: 班 级: 姓 名: 学 号: 词法分析器的设计 实验目的 通过完成词法分析程序,了解词法分析的过程。编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。 实验环境 操作系统:window xp 编写环境:visual c++ 、c-free、turbo c 编写语言:c语言 分析语言:PL/0 实验内容 对PL/0语言进行词法分析,把输入的字符串形式的源程序分割成一个个单词符号,其词法描述如下: 关键字:begin,call,const,do,end,if,odd,procedure,read,then,var,while,write 标识符:用来表示各种名字,必须以字母开头小于10位字符组成 数字:以0-9组成小于14位的数字 运算符:+,-,*,/,:=,<,<=,>,>= 界符:,,.,;,# 表1 各种单词符号对应类型表 单词符号 类型 + plus - minus * times / slash ( lparen ) rparen = eql , comma . perio # neq ; semicolon begin beginsym call callsym const constsym do dosym end endsym if ifsym odd oddsym procedure proceduresym read readsym then thensym var varsym while whilesym write writesym N N N Y Y 开始 调用GETSYM取单词 输入要分析的文件 文件是否存在 文件是否结束 结束 打印分析结果 图1 主流程图 Y Y N N N N N Y Y Y Y GETSYM 滤空CH=空? GETCH CH是字母? K:=0 K<10? K:=K+1 A[K]:=CH GETCH CH是字母或数字? ID:=A ID是否是保留字? SYM:=IDENT 相应保留字类别送SYM 返回 CH是数字? 拼数,将拼数后的值送NUM SYM:=SYM 把该字符转换成对应单词,或拼复合单词,将其类别送SYM中 图2 GETSYM流程图 N Y GETSYM函数功能: 滤空格 空格在词法分析时是一种不可缺少的界符,而在语法分析时则是无用的,所以必须过滤 识别保留字 主程序定义了一个以字符为元素的一维数组WORD,称保留字表。对字母开头的字母、数字字符串要查此表。若查着则识别为保留字,将对应的类别放在SYM中。如IF的对应值IFSYM,THEN的对应值为THENSYM。若查不着,则认为是用户定义的标识符 识别保留字 对用户定义的标识符将IDENT放在SYM中,标识符本身的值放在ID中 拼数 当扫描到数字串时,将字符串形式的十进制数转换为二进制数,然后把数的类别NUMBER放在SYM中,数值本身的值放在NUM中 拼合复合词 对两个字符组成的算符,如:>=、:=、<=等单词,识别后将类别送SYM中 输出源程序 为边读入字符边输出(可输出在文件中) N N N GETCH 缓冲区是否还有字符? 源程序文件是否结束? 打印出错信息 停止编译 读入一行源程序放入在LINE中并输出,置CC:=0 CC:=CC+1 CH:=LINE[CC] 返回 Y Y 图3 GETCH流程图 实验结果 要分析的内容如下: const a=35; var c,d; procedure p; begin var g; g:=465494366466564444; write(g); end; begin read(c,d); if c<=d then c:=a; write(c,d); call p; end. 调试分析(实验中遇到的问题总结) 数组a[a1+1]的长度为11,而保存数字是数据过长导致溢出 解决方法:将a数组的数据大小改为50; 如果将程序最后的‘.’去掉,会导致死循环,原因为读入的下一个字符为空时无法退出循环,,导致死循环 解决方法:当读入字符为10时,如果下一个读入的字符为0,则单独判断下,具体见附录修改后的代码 实验小结(心得体会) 代码通过getsym()函数来读入一个词语进行分析,同时通过getch()函数来读入下一个字符,要注意的是回车也算是一个字符,程序是通过EOF来结束的,代码都是对ASCII码进行操作,回车为10,要注意数组能保存的大小,保证数组不越界,同时对数据进行判断,保证符合词法要求; 附录:源代码 #include<stdio.h>

文档评论(0)

_______ + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档