编译原理 词法分析课件.pptx
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《编译原理 词法分析课件.pptx》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译原理 词法分析课件 编译 原理 词法 分析 课件
- 资源描述:
-
1、第三章 词法分析赵建华南京大学计算机系2009年2月内容 词法分析器的作用 词法单元的规约 词法单元的识别 词法分析器生成工具Lex 有穷自动机 从正则表达式到自动机 词法分析器生成工具的设计方法词法分析器的作用 读入源程序字符流、组成词素,输出词法单元序列。过滤空白、换行、制表符、注释等。将词素添加到符号表中。在逻辑上独立于语法分析,但是通常和语法分析器处于同一趟中为什么要设立独立的词法分析器 简化编译器的设计 词法分析器可以首先完成一些简单的处理工作。提高编译器效率 相对于语法分析,词法分析过程简单,可高效实现。(下推自动机 vs 有穷自动机)增强编译器的可移植性词法单元、模式、词素 词法
2、单元 单元名是表示词法单位种类的抽象符号;语法分析器通过单元名即可确定词法单元序列的结构。属性值通常用于语义分析之后的阶段 模式 描述了一类词法单元的词素可能具有的形式 词素 源程序中的字符序列 它和某个词法单元的模式匹配,被词法分析器识别为该词法单元的实例。词法单元、模式、词素(例子)printf(“Total=%dn”,score);printf,score和标识符(id)的模式匹配“Total=%dn”和literal的模式匹配词法单元的属性 一个模式匹配多个词素时,必须通过属性来传递附加的信息。属性值将被用于语义分析、代码生成等阶段。不同的目的需要不同的属性。因此,属性值通常是一个结构
3、化数据。词法单元id的属性 词素、类型、第一次出现的位置、内容 词法分析器的作用 词法单元的规约 词法单元的识别 词法分析器生成工具Lex 有穷自动机 从正则表达式到自动机 词法分析器生成工具的设计方法词法单元的规约 正则表达式可以高效、简洁地描述处理词法单元时用到的模式类型。内容 串和语言 语言上的运算 正则表达式 正则定义 正则表达式的扩展串和语言(1)字母表(alphabet):一个有穷的符号集合。符号典型例子:字母、数位、标点符号。例子:0,1;ASCII;Unicode 在理论上,我们可以把任意的有限集合看作字母表。字母表上的串(string)是该字母表中符号的有穷序列。串s的长度,
4、即|s|,是指s中符号出现的次数;空串:长度为0的串,语言(language)是某个给定字母表上的串的可数集合。串和语言(2)和串有关的术语(bannana)前缀:从串的尾部删除0个或多个符号后得到的串。(ban、banana、)后缀:从串的开始处删除0个或多个符号后得到的串。(nana、banana、)子串:删除串的某个前缀和某个后缀得到的串。(banana、nan、)真前缀、真后缀、真子串:既不等于原串,也不等于空串的前缀、后缀、子串。(前面例子的红色部分)子序列:从原串中删除0个或者多个符号后得到的串。(baan)串和语言(3)串的运算 连接(concatenation):x和y的连接时
5、把y附加到x的后面形成的串,记作xy。x=dog,y=house,xy=doghouse 指数运算(幂运算):s0=,s1=s,si=si-1s;x=dog,x0=,x1=dog,x3=dogdogdog串和语言(4)语言的运算串和语言(5)例子 L=A,B,Z,a,b,z D=0,1,9 L U D=A,B,Z,a,b,z,0,1,9 LD:520个长度为2的串的集合 L4:所有由四个字母构成的串的集合 L*:所有字母构成的集合,包括。L(L U D),D+正则表达式字母表上的正则表达式的定义 基本部分 是一个正则表达式,L()=如果a是上的一个符号,那么a是正则表达式,L(a)=a 归纳步
6、骤:选择:(r)|(s),L(r)|(s)=L(r)U L(s);连接:(r)(s),L(r)(s)=L(r)L(s);闭包:(r)*,L(r)*)=(L(r)*;括号:(r),L(r)=L(r)运算的优先级:*连接|正则集合:可以用一个正则表达式定义的语言正则表达式的例子=a,b L(a|b)=a,b L(a|b)(a|b)=aa,ab,ba,bb L(a*)=,a,aa,aaa,aaaa,L(a|b)*)=,a,b,aa,ab,ba,bb,aaa,aab,L(a|a*b)=a,b,ab,aab,aaab,正则集合、等价 如果L(r)=L(s),正则表达式r和s等价。正则定义(1)为了书写方
7、便,可以给正则表达式命名,且可以通过名字使用正则表达式 正则定义是如下形式的定义序列d1 r1d2 r2 dnrn 其中:di不在中,且各不相同 每个ri是字母表 U d1,d2,di-1上的正则表达式。这保证了不会出现递归定义。正则定义(2)各个di的上的正则表达式如下:d1的正则表达式即r1。将r2中的d1替换为r1,得到d2的正则表达式。将ri中的d1,d2,di-1替换为各自的正则表达式,得到di的正则表达式。注意:替换的时候不能破坏替换进去的di的完整性。正则定义的例子 C语言标识符的正则定义 letter_ A|B|Z|a|b|z|_ digit 0|1|9 id letter_(
8、letter_|digit)*id对应的正则表达式为(A|B|Z|a|b|z|_)(A|B|Z|a|b|z|_)|(0|1|9)*正则表达式的扩展 基本运算符:并、连接、Kleen闭包 扩展的运算符:一个或多个实例:单目后缀+r+等价于rr*零个或一个实例:?r?等价于|r 字符类 a1a2an等价于a1|a2|an a-e等价于a|b|c|d|e 使正则表达式更加简洁,但不会使正则表达式的描述能力增强内容 词法分析器的作用 词法单元的规约 词法单元的识别 词法分析器生成工具Lex 有穷自动机 从正则表达式到自动机 词法分析器生成工具的设计方法词法单元的识别 词法分析器要求能够检查输入字符串,
9、在前缀中找出和某个模式匹配的词素。首先通过正则定义来描述各种词法单元的模式。定义ws(blank|tab|newline)+来消除空白 词法分析器识别到这个模式时,不返回词法单元,继续识别其它模式。状态转换图 词法分析器的重要组件之一 状态转换图(transition diagram)状态(state):表示在识别词素时可能出现的情况 状态看作是已处理部分的总结。某些状态为接受状态或最终状态,表明已找到词素。加上*的接受状态表示最后读入的符号不在词素中。开始状态(初始状态):用start边表示。边(edge):从一个状态指向另一个状态;边的标号是一个或多个符号。当前符号为s,下一个输入符号为a
10、,就沿着从s离开,标号为a的边到达下一个状态。状态转换图的例子保留字和标识符的识别 在很多时候,保留字也符合标识符的模式,识别标识符的状态转换图也会识别保留字。解决方法 在符号表中预先填写保留字,并指明它们不是普通标识符。为关键字/保留字建立独立的、高优先级的状态转换图。其它的状态转换图词法分析器的体系结构 从转换图构造词法分析器的方法 变量state记录当前状态 一个switch根据state的值转到相应的代码 每个状态对应于一段代码。这段代码根据读入的符号,确定下一个状态 如果找不到相应的边,则调用fail()进行错误恢复 进入某个接受状态时,返回相应的词法单元。注意状态有*标记时,需要回
11、退forward指针。实际是模拟转换图的运行Relop对应的代码概要处理多个模式的方法 词法分析器需要匹配多个模式 解决方法 按照优先级,顺序地尝试各个状态转换图。如果引发fail(),回退并尝试下一个状态图。更好的方法:“并行地”运行各个状态转换图。通过greedy策略,识别最长的和某个模式匹配的输入前缀 实际使用的方法:预先把各个状态转换图合成一个状态转换图,然后运行这个状态转换图。内容 词法分析器的作用 词法单元的规约 词法单元的识别 词法分析器生成工具Lex 有穷自动机 从正则表达式到自动机 词法分析器生成工具的设计方法词法分析工具Lex/Flex Lex/Flex是一个有用的词法分析
12、器生成工具 通常和Yacc一起使用,生成编译器的前端Lex源程序的结构 声明部分包含:明示常量:表示常数的标识符 正则定义 转换规则 模式 动作 模式:正则表达式 动作:识别到相应模式时采取的处理方式。辅助函数 动作中使用的函数声明部分%转换规则%辅助函数Lex程序的形式词法分析器的工作方式 Lex生成的词法分析器作为一个函数被调用;在每次调用过程中,不断读入余下的输入符号 发现最长的、与某个模式匹配的输入前缀时,调用相应的动作;该动作进行相关处理,并把控制返回;如果不返回,则词法分析器继续寻找其它词素。Lex程序的例子(1)%和%之间的内容一般被直接拷贝到lex.yy.c中;这里的内容就是一
展开阅读全文