安徽大学编译原理试验三技术总结.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
词法分析器及其算法的设计与实现2015年11月11日星期三班级:13级软件工程学号: 姓名:李世(一).词法分析器的设计1.1 目的与要求通过设计、编写和调试词法分析程序(又称扫描器),了解扫描器的组成结构,不同种类单词的识别方法,掌握由单词的词法规则出发,画出识别单词的状态转换图,然后再用程序实现的扫描器的设计方法。1.2 词法分析器实现中的约定设计的扫描器可以是一个子程序,也可以是一个完整的程序,其输入是源程序字符串,输出是单词符号本身。为简化编译程序的编写过程,对Simple语言源程序的书写,可以做如下假定:假定Simple语言采用自由格式书写;可以使用注释,用/*……*/或者//标识,但注释不能插在单词内部,注释要在一行内结束。若在某一行的结束,没有遇到注释后面的结束标记,自动认为注释结束;一行可以有多个语句,一个语句也可以分布在多个行中,单词之间、语句之间可以插入任意空格,但单词中间不能有空格符号,单词中间也不能有回车换行符,即单词不能跨行书写;为了避免超前搜索、提高运行效率,假定关键字都是保留字。1.3 词法分析器的总体设计词法分析器的功能时从源程序中读入一个个字符,依据一定的构词规则,识别出各类有用的单词。图1为词法分析器的输入输出接口:对图1细化,可得词法分析程序的顶层数据流图,如图2所示:细化图2可得词法分析程序的详细数据流图:在词法分析程序的详细数据流图中,各个加工处理模块完成的功能如下:1.1读一行并显示:收到读下一行的命令后,从源程序读入一行,装入缓冲区buffer,行计数器加1,并打印。需要注意的是,回车换行在源程序(文本文件)中用两个字符0D0AH来表示,而用高级语言(C语言)读入内存后,就用一个字符0AH来表示,这是在用高级语言编写词法分析器时常被忽略而导致错误的原因。1.2 读一非空字符:收到读入一个字符的命令后,从缓冲区读入一非空字符(空格的ASCII码为20H),列计数器加1.若buffer已空,则在读入一行,类计数器置0.1.3 分类:根据单词的首字符决定对不同单词的处理。1.4 识别标识符/关键字:当读入一个字母时,开始识别标识符和关键字,边拼写边从buffer中读入下一个符号。当读入一非字母、数字符号时,标识符识别已经完成。但已经多读入一个符号,所以列计数回退,减1。然后查关键字表,判断拼出的符号串是否为关键字。若是关键字,输出其种别码(token);否则识别的单词就是标识符,同时输出标识符及其种别码。1.5 识别数值常数:当读入数字时,开始识别整数或实数。边拼写边读入下一个符号,当遇到“.”时,还要继续拼写该常数(实数情况)。如果遇到E或e,要识别带指数的常数。如果遇到其他非数字符号时,数字常数识别完毕。输出常数及其种别码。1.6 处理注释/除号:当读入“/”时,开始识别注释或除号。若是注释(“/*”)时,最后两个连续读入的符号应是“*/”,不再读入下一符号,列计数器不变。当判定是除号“/”时,已多读入一个字符,列计算器减1,输出除号“/”的种别码。同样可识别注释符号//。1.7 识别界符和运算符识别其他界符,对于、、:等符号,还需要再读入下一个符号,判断是否为双界符。若不是,列计数器减1,输出单词的种别码。1.8 识别文字常数:当读入单引号时,忽略它,开始拼写字符常数,不断读入下一个符号,搜索下一个单引号,当读入下一个单引号时,字符常数拼写结束。最后列计数器不减1,然后输出该常数。注:以上加工1.4~1.8都需要从buffer中每次读入一个字符,进行列计数。由于假定每个单词不跨行,所以不用考虑从源程序中读出下一行到缓冲区的功能。1.9 输出token:对于各种界符与关键字输出其在编译器的内部表示形式(token),对常数与标识符则让它流入下一个加工。2 查填符号表:如果是标识符或常数,首先查看名字栏和类型栏(字符常数的类型栏中填有“字符常数”,标识符的类型栏空白),判断有无同名和同类型的入口。如果有同名入口P1,则把P1作为token的自身值填入它的二元式;如果不同名,则将字符串存入符号表中,把它的长度和在字符串表中的开始位置及其类型(标识符为空白)填入符号表的新入口P中,并把P作为token的自身值填入二元式中。对数值常数的处理是:先查符号表的val栏,若发现相同的常数则直接输出其二元式。若表内无相同的常数,则将数值常数填入表内,在type栏内填入整型或实型,然后输出其二元式。二元式包含该常数在符号表中的入口。1.4 词法分析程序的详细设计将图3的词法分析程序的详细数据流图,可以得到词法分析程序的总体框架。词法分析器的输出:(1)源文件的token表(系统单词出现几次就输出几次)所在行号单词本身token号………….………….…….…….(2) 源文件的符

文档评论(0)

希望之星 + 关注
实名认证
文档贡献者

我是一名原创力文库的爱好者!从事自由职业!

1亿VIP精品文档

相关文档