词法分析-编译原理.ppt

  1. 1、本文档共80页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
词法分析-编译原理

第三章 词法分析器的设计方法 状态转换图 正规表达式与有限自动机 3.1 词法分析器的设计方法 词法分析器:执行词法分析的程序。是编译器中唯一与源程序打交道的部分。 任务:从左到右、逐个字符地对源程序进行扫描,产生一个个单词符号。 过滤掉程序中的无用成分,如注释、空格、回车等。 处理与具体平台有关的输入,如文件结束符的不同表示等。 调用符号表管理器或者出错处理器,进行相关的处理。 进行宏展开等工作。 词法分析器的输入/输出 输入:源程序。 输出:单词符号。 单词符号的种类: 关键字(保留字、基本字)—如if, then, while, do, for等。 标识符—表示各种名字,如变量名,数组名和过程名。 常数—各种类型的常数。 运算符— +, -, *, /, , , =等。 界符—逗号、分号、括号、空白等。 词法分析器的输入/输出 输出的单词符号表示形式: (单词种别, 单词自身的值) 单词种别:通常用整数编码表示 如果一个种别只有一个单词符号,那么种别编码就代表该单词符号。 如果一个种别有多个单词符号,则对于每个单词符号,必须给出种别编码和自身的值。 关键字、运算符和界符,都可以是1个符号对应1个种别,也可以是1类对应一个种别。 标识符自身的值可以表示为按机器字节划分的内部码。 常数按类型分种,其值可表示为标准的二进制形式。 例3.1 对于C语言中的语句 while(i=j) i--; 输出的单词符号串为: while, - (, - id, 指向i的符号表项的指针 =, - id, 指向j的符号表项的指针 ), - id, 指向i的符号表项的指针 --, - ;, - 词法处理器的处理结构 把词法分析程序作为主程序,将词法分析作为独立的一遍来完成。 优点:结构简单清晰,增加了编译系统的可移植性。 输入与预处理 设定一个输入缓冲区。 输入串放在输入缓冲区中。 增加预处理子程序。 去除无用的空白、回车等编辑性字符以及注释部分; 每一次对一串订场的输入字符进行预处理,并将处理的结果装入一个指定的缓冲区(扫描缓冲区)。 设定一个扫描缓冲区 扫描缓冲区进行扫描时一般用到两个指示器:一个指向当前正在识别的单词的开始位置(单词的首字符);一个用于向后搜索单词的终点。 例如:将扫描缓冲区分成两个半区: (1)每个半区容纳120个字符; (2)半区可以互补使用; (3)标识符和常数的长度不大于120个字符。 词法分析器的结构 3.2 状态转换图 状态转换图是一张有限个结点的有向图。 结点代表状态,用圆圈表示; 状态之间用有向的箭头连接,箭头上的标记(字符)表示在当前状态下,如果出现(输入)该标记,将从当前状态跳转到下一个状态。 状态是有限的,其中有一个是初态,至少有一个终态(用双圈表示)。 一个状态转换图可用于识别(接受)一定的字符串。 在状态转换图中,到达单词符号的终态时即可得到相应的单词编码。 到达终态时多读入了一个符号,识别出该单词后再将多读入的那个符号退回。在终态上以*作为标识。 每个状态都对应一小段程序。 对于不含回路的分支状态,可对应一个switch( )语句或一组if-else语句。对于含回路的状态,可对应一个while语句。 右线性文法?状态转换图 在将文法非终结符作为结点的基础上,增加一个额外的结点; 文法中的开始符号为初态结点编号,新增额外的结点作为终态结点,单独编号; 对每一个形如A?aB的产生式,都有一条弧线从结点A指向B,并用符号a标记该弧线; 对每一个形如A?a的产生式,都有一条弧线从结点A指向终态结点,并以符号a标记该弧线。 例3.2 已知文法G[S]=({S,A,B},{a,b},S,P1), 其中P1={S?aA, A?aA, A?bB, A?b, B?bB, B?b} 画出文法的状态转换图。 助记符 识别C语言子集的词法分析器 引进一组变量和过程 character: 字符变量,存放最新读入的源程序字符。 token: 字符数组,存放构成单词符号的字符串。 getbe( ): 若character中字符为空,则调用getchar( ),直至character为非空。 concatenation( ): 将token中字符串与character中字符连接作为token中新字符串。 letter( )和digit( ): 判断character中的字符是否为字母和数字的布尔函数,若是则返回

您可能关注的文档

文档评论(0)

zhuliyan1314 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档