- 1、本文档共26页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
天津大学编译原理讲义-Part3词法分析1
数据库原理与Oracle——SQL语言 Part3词法分析 授课:胡静 内容提要 词法分析器的作用 词法分析程序的设计与实现——状态图 词法分析程序的自动生成——有穷自动机 一个简单的编译器结构 简单的前端结构 编译前端是如何进行工作的 编译前端是如何进行工作的 第一步:词法分析 词法分析器在编译器中的位置 词法分析是编译的第一阶段。其任务是从左到右逐字的对源程序进行扫描,产生一个一个的单词符号,把作为字符串的源程序改造成为单词符号串的中间程序。 词法分析是编译过程中的一个阶段,在语法分析前进行 。也可以和语法分析结合在一起作为一遍,由语法分析程序调用词法分析程序来获得当前单词供语法分析使用。 词法分析程序的功能 词法分析:根据词法规则识别及组合单词,进行词法检查 对数字常数完成数字字符串到二进制数值的转换 删去空格字符和注释 词法分析器的输出形式 词法分析器所输出的单词符号常常表示成如下的二元式: (单词种别,单词符号的属性值) 单词符号的属性信息是指单词符号的特性或特征,属性值则是反应特性和特征的值。 对于某个标识符,常将存放它的有关信息的符号表项的指针作为其属性值 对于某个常数,则将存放它的常数表项的指针作为其属性值。 单词符号分类举例 单词符号输出例子 对于C++语言的代码:while (i = j) i--; 经词法分析器处理后,应该成为: $WHILE, - $LPAR, - $ID, 指向i的符号表项的指针 =, - $ID, 指向j的符号表项的指针 RPAR, - $ID, 指向i的符号表表项的指针 --, - ;, - 词法分析中的错误 词法分析器不能从全局的角度考察源程序,所以能在词法分析阶段发现的错误是有限的。主要是不符合合法标识符拼写的错误。 例如,如果词法分析器第一次碰到如下的C语言程序:fi(a==f(x))… 词法分析器无法区别fi究竟是关键字if的错误拼写还是一个未声明的函数标识符。由于fi是合法的标识符,词法分析器必须返回该标识符的记号,让编译器的其他阶段去处理这种错误。 词法分析中的错误恢复 在词法分析阶段对错误进行纠正的假设前提:大多数词法错误是多、漏或错了一个字符或者相邻的两个字符错位的结果。 对错误进行修补最直观的策略是看:剩余输入的前缀能否通过上面的一个变换变成一个合法的词素。 最简单的错误恢复策略是“紧急方式”恢复,即反复删除掉剩余输入最前面的字符,直到词法分析器能发现一个正确的记号为止。 其他的恢复动作包括:删除一个多余的字符、插入一个遗漏的字符、用一个正确的字符代替一个不正确的字符、交换两个相邻的字符 词法分析器的设计与实现 输入、预处理和单词的识别(超前有哪些信誉好的足球投注网站) 预处理,主要是针对空白符、跳格符、回车符和换行符等编辑性字符的处理。 关键字的识别 像FORTRAN这样的语言,关键字不加以特殊保护,关键字和用户自定义的标识符或标号之间没有特殊的界符做间隔。这使得关键字的识别甚为麻烦。 1.DO99K = 1, 10 2.IF(5.EQ.M) I = 10 3.DO99K = 1.10 4.IF(5.EQ.M) = 55 其中,语句1和2是DO和IF语句,他们都是以基本字开头的,语句3和4是赋值语句,都是以用户自定义的标识符开头的。 其他单词符号的识别 标识符的识别 多数语言的标识符是字母开头的“字母/数字”串,而且在程序中标识符的出现都后跟这算符或者界符。因此标识符的识别没有太大的困难。 常数的识别 基本来讲常数的识别也是很直接的,有些需要用到超前有哪些信誉好的足球投注网站。 如5.E08和5.EQ.M。 算符和界符的识别 词法分析器将那些多个字符复合成的算符和界符(如++、--、=)拼合成一个单词符号。因为这些单词符号是不可分的整体,若分划开来,便失去了原来的意义。这里需要超前有哪些信誉好的足球投注网站。 状态转换图 状态转换图是一张有限方向图; 结点代表状态,用圆圈表示; 状态之间用箭弧连接, 箭弧上的标记(字符)代表在射出结点(即箭弧始结点)状态下可能出现的输入字符或字符类。 一张转换图只包含有限个状态(即有限个结点),其中一个被人为是初态,而且实际上至少要有一个终态(用双圆圈表示)。 一个状态转换图可用于识别(或接收)一定的字符串。 状态转换图示例 终态结点上打了一个星号*,意味着多读进了一个不属于标识符部分的字符,应该把它退还给输入串。 如果在状态0时的输入不能符合任何一条转换路径,那么就说明这个转换图工作不成功,不能识别出标识符。 状态转换图实例 状态转换图的实现 ch:字符变量,存放必威体育精装版读进的源程序字符 strToken:字符数组,存放构成单词符号的字符串 GetChar:子程序过程,将下一个输入字符读到ch中,有哪些信誉好的足球投注网站指示
文档评论(0)