编译原理第3章(精品·公开课件).pptVIP

  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文档。上传文档
查看更多
第三章 词法分析 这一章将讨论词法分析程序的构造。 词法分析的任务:从左至右逐个字符地对源程序进行扫描,产生一个个的单词符号,把作为字符串的源程序改造成为单词符号串的中间程序。 前一部分讨论手工构造方法,后一部分讨论自动构造方法。 3.1对于词法分析器的要求 词法分析器的功能和输出形式 词法分析器的功能是输入源程序,输出单词符号。单词符号是一个程序语言的基本语法符号。程序语言的单词符号一般可分为下列五种。 (1)关键字(保留字或基本字) (2)标识符 (3)常数(整型、实型、布尔型、文字型等) (4)运算符。 (5)界符(逗号、分号、括号、/*,*/等)。 词法分析器所输出的单词符号常常表示成如下的二元式: (单词种别,单词符号的属性值) 考虑下述c++代码段: while(i>=j)i--; 经词法分析器处理后,它将被转换为如下的单词符号序列: <while,-> <(,-> <id,指向i的符号表项的指针> <>=,-> <id,指向i的符号表项的指针> <),-> <id,指向i的符号表项的指针 <--,-> <;,-> 词法分析器作为一个独立子程序 可使整个编译程序的结构更简沽、清晰和条理化。 也可以把词法分析器安排成一个子程序,每当语法分析器需要一个单词符号时就调用这个子程序。每一次调用,词法分析器就从输人串中识别出一个单词符号,把它交给语法分析器。 3.2词法分析器的设计 输入、预处理 词法分析器工作的第一步是输入源程序文本。输入串一般是放在一个缓冲区中,这个缓冲区称输入缓冲区。 扫描缓冲区进行扫描时一般用两个指示器,一个指向当前正在识别的单词的开始位置(指向新单词的首字符),另一个用于向前搜索以寻找单词的终点。 超前扫描 关健字的识别 :(如FORTRAN语言 ) 1 D099K=1,10 2 IF(5 .EQ.M)I=10 3 D099K=1 .10 4 IF(5)=55 标识符的识别 常数的识别 算符和界符的识别 状态转换图 转换图是一张有限方向图。在状态转换图中,结点代表状态,用圆圈表示。状态之间用箭弧连结。箭弧上的标记(字符)代表在射出结点(即箭弧始结点)状态下可能出现的输入字符或字符类。 一张转换图只包含有限个状态(即有限个结点),其中有一个被认为是初态,而且实际上至少要有一个终态(用双圈表示)。一个状态转换图可用于识别(或接受)一定的字符串。 状态转换图的实现 (1) ch 字符变量,存放最新读进的源程序字符。 (2) strToken 字符数组,存放构成单词符号的字符串。 (3) GetChar 子程序过程,将下一输入字符读到ch中,搜索指示器前移一字符位置。 (4) GetBC 子程序讨程.检杳ch中的字符是否为空白。若是,则调用GetChar直至ch中进入一个非空白字符 (5) Concat 子程序过程,将ch中的字符连接到strToken之后。 (6) IsLetter和IsDigit 布尔函数过程,它们分别判断ch中的字符是否为字母和数字。 (7) Reserve 整型函数过程,对strToken中的字符串查找保留字表,若它是一个保留字则返回它的编码,否则返回0值(假定0不是保留字的编码)。 (8) Retract 子程序过程,将搜索指示器回调一个字符位置,将ch置为空白字符。 (9) InsertId 整型函数过程,将strToken中的标识符插入符号表,返回符号表指针。 (10)InsertConst 整型函数过程,将strToken中的常数插入常数表,返回常数表指针。 对于不含回路的分叉结点来说,可让它对应一个switch语句或一组if ... then ... else语句。 例如,下图状态结点i所对应的程序段可表示为: GetChar(); if(IsLetter()){…状态J的对应程序段…;} else if(IsDigit()){…状态k的对应程序段…;} else if(ch=‘/’){…状态I的对应程序段…;} else {…错误处理…;} 对于含回路的状态结点来说,可让它对应一个由while语句和if语句构成的程序段。 例如,下图的状态结点i所对应的程序段可为: CetChar(); while(IsLetter()or IsDigit()) CetChar(); …状态j的对应程序段… 终态结点一般对应一个形如return(code,value)的语句。 其中,code为单词种别编码;value或是单词符号的属性值,或无定义。 3

文档评论(0)

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

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

1亿VIP精品文档

相关文档