- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第2章 词法分析 ;2.1 词法分析器的设计考虑及手工构造;2.1.1 单词类型及二元式编码;㈢单词二元式编码
经词法分析后,单词用二元式 (code,val) 表示。
code表示单词的种别,用整数码表示。单词种别表示单词的语法特性,在语法分析时使用。
val表示单词的值,在本书中用字符串表示。单词值表示了单词的语义特性,在语义分析时使用。;㈤实例
设有某一程序设计语言,其部分单词二元式编码如下所示:;2.1.2 源程序的输入及预处理 ; 设源程序如下所示,其中\为续行符。;㈡预处理
词法分析器通常由二个部分构成:
预处理程序
扫描器(单词识别程序);②预处理主要工作
删除注释
删除续行符,以及后续换行符(0AH)。
换行符、TAB和空格具有界符作用,预处理时通常予以保留。在后面的分析中可以看到,它们的存在反而给后续的单词识别带来方便。为了简化判断,可在预处理时,将换行符和TAB统一替换为空格。
大多数语言(除C语言)不区分大小写,可在预处理时,将大写字母变换成小写字母,或相反,以方便后续处理。
对于受书写格式限制的语言(例Fortran和Cobol),还应识别标号区,正确给出语句标号。识别续行标志,把相继行捻接在一起,给出语句结束符。;㈢预处理例
用伪代码编写一个预处理程序,要求如下:
去除源程序中注释(源程序中的注释用/*……*/标记,不允许嵌套使用)
去除源程序中续行符(\)
将TAB和换行符替换为空格
将大写字母变换成小写
在源程序尾部添加字符#,这是编译程序内部的一个特殊的单词,以示源程序结束。
每调用一次,将经预处理的源程序全部送入内存中的扫描缓冲区,供扫描器识别单词。;①算法说明
用伪代码编写预处理程序,输入和预处理可同时进行,无需输入缓冲区,将读入后经预处理的源程序直接送扫描缓冲区buf[1..n]。
定义布尔变量 in_comment,记录当前处理字符是否处于注释。
若in_comment 的值为false,则表示当前读入字符未处于注释中,此时应将当前处理字符存入扫描缓冲区;若in_comment 的值为true,则表示当前处理字符处于注释中,此时无需将该字符存入buf中,相当于掉弃。
当读入“/*”,???尔变量in_comment的值由false变为true;当读入“*/”,布尔变量in_comment的值由true变为false。可用变量cur_c记录当前正在处理的字符,用old_c记录刚处理过的字符。;0. procedure pro_process() //扫描缓冲区buf[ ]和扫描缓冲区指针i
1. old_c←‘\0’:in_comment←false:cur_c←文件第一个字符:i←1
2. while not eof(“source.txt”) do //文件尚未处理完
3. if not in_comment then //当前字符未处于注释中
4. if old_c=/ and cur_c=* then //进入注释
5. i←i-1:in_comment←true
6. else
7. if old_c=\ and cur_c=换行符 then i←i-1 //是续行符
8. else
9. if cur_c≥A and cur_c≤Z then cur_c←cur_c+32
10. if cur_c=制表符 or cur_c=换行符 then cur_c←空格
11. i←i+1:buf[i]←cur_c //送入扫描缓冲区
12. end if
13. end if
14. else //当前字符处于注释中
15. if old_c=* and cur_c=/ then in_comment←false //离开注释
16. end if
17. old_c←cur_c:cur_c←文件下一个字符
18. end while
19. i←i+1:buf[i] ←#
20. end procedure;2.1.3 基本字的识别和超前搜索; 解决办法是超前搜索,一直扫描到右括号后面的字符。若该字符为字母G或g,则为逻辑IF;若为数字,则为算术IF;若为=,则为标识符。
超前搜索导致词法分析器实现困难。为了降低词法分析器的复杂性,避免超前搜索,在实际实现中,大多数语言的编译程序对用户采取了二条限制措施:
①所有基本字均为保留字,用户不得使用它们作为标识符。
②将空格、TAB和换行符视为界符。在基本字、用户定义的标识符和常数之间,若没有运算符或界符,则至少用一个空格(或TAB、换行符)加以分隔。;
原创力文档


文档评论(0)