- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第四章 词法分析 词法分析的主要任务是对源程序进行扫描,从中识别出单词,它是编译过程的第一步,也是编译过程中不可缺少的部分。 本章介绍词法分析程序的手工构造和自动构造原理。 4.1 词法分析概述 词法分析的任务是:从左至右逐个字符地扫描源程序形式的字符流,将这些单个字符组合成一个个单词符号,把作为字符串的源程序转换成由单词符号串组成的中间语言程序供语法分析使用。因此,词法分析是编译程序的基础。 把词法分析从语法分析中独立出来有下述优点: ① 部分编译时间花费在扫描字符上。 ② 单词符号的语法可以用非常简单的文法加以描述。 ③ 对同一语言来说,常有不同的表示方法。 ④ 高级语言时,需要考虑词法和语法两方面的特性,若把两者分开,有利于分别地研究它们。 可以把词法分析程序作为独立的一遍去编写,它实现源程序的全部词法分析工作,并把转换后的内部形式的源程序传递给语法分析程序。 也可以把它设计成一个子程序 (如有图所示)。 4.2 单词符号 单词符号是语言的基本符号,它具有独立的意义且是不可再分的。程序语言中的大部分单词符号都属于下述几类之一。 ① 标识符。用以表示各种名字,如变量名,过程名等等; ② 保留字(或键字)。如if,goto,begin,end等等,它实质上是标识符的一个子集。 ③ 整数。125,38,0,1等等; ④ 单分界符。如+,-,*,/,(,),’,;,·等等; ⑤ 复合分界符。如**,/*,:=等等。 例4.1 识别标识符的状态转换图如下左图所示: 其中0为初态,2为终态,它识别标识符的过程为: 从初态0开始,若输入符号识一字母,则读进它,并转到状态1;在状态1下,若下一个输入符号是字母或数字则读进它,并重新进入状态1; 重复这个过程,直至在状态1下发现读入的符号不再是字母或数字时(注意,此时该字符已被读出),就进入状态2。 状态2是终态,它意指至此已识别出一个标识符,识别过程终止。若在状态0下输入符号不是字母,则意味着识别不出所给的输入串是一个标识符。 4.3 扫描程序的设计 下面用一个比较简单的语言作为例子来讨论扫描程序的设计。 假定该语言中有分界符或运算符(如+,-,*,/,(,)),键字(如begin,abs,end),标识符(非保留字)以及整数。 至少要有一个空白符将相邻的标识符、整数和(或)键字隔开,但不能用空白符将符号中的相邻字符分开。 此外,注解是以符号/*开始,并以符号/*的第一次出现作为结束的。 扫描程序构造每个单词符号的内部表示,这种表示通常是一个定长的整数。编译程序的其余部分将只加工这些定长的整数。下表给出了这些符号的内部表示。 例 4.3 对于程序段 begin A+B*C/* Comment */ end 扫描程序将产生下面的结果: 状态转换图可用于识别符号串,而且使识别工作直观化。因此我们先画一个用于识别符号的转换图。 根据转换图编写出扫描程序。该程序有两个参数:SYN和SEM,其中,SYN表示所标识的那个单词符号的内部表示;SEM是组成该符号的字符串。SYN和SEM可以是两个全局量,它们的作用域即扫描程序本身以及所有调用它的地方。该过程使用了Case语句,它根据Char中字符的类型数进行判断处理。 Procedure SCAN(SYN:integer;SEM:string); begin start:GETNB;Token:= ‘’; Case Class of 1:begin while Calss=1 do begin Token:=Token CAT Char; GETCHAR; end; SYN:=$INT; end; 2:begin while class=2 do begin Token:=Token CAT Char; GETCHAR; end; SYN:=$ID; LOOKUP(Token); if add≠0 then SYN:=add; end; 3:begin Token:=Char;GETCHAR; if Char= ‘*’ then begin h1:GETCHAR; h2:if Char≠‘*’then go to h1; GETCHAR; if Char≠‘/’ then goto h2; GETCHAR;goto start; end else SYN:=$SLASH end; 4:begin L
文档评论(0)