欢迎来到163文库! | 帮助中心 精品课件PPT、教案、教学设计、试题试卷、教学素材分享与下载!
163文库
全部分类
  • 办公、行业>
  • 幼教>
  • 小学>
  • 初中>
  • 高中>
  • 中职>
  • 大学>
  • 各类题库>
  • ImageVerifierCode 换一换
    首页 163文库 > 资源分类 > PPTX文档下载
    分享到微信 分享到微博 分享到QQ空间

    编译原理 词法分析课件.pptx

    • 文档编号:4734923       资源大小:1.22MB        全文页数:81页
    • 资源格式: PPTX        下载积分:28文币     交易提醒:下载本文档,28文币将自动转入上传用户(晟晟文业)的账号。
    微信登录下载
    快捷注册下载 游客一键下载
    账号登录下载
    二维码
    微信扫一扫登录
    下载资源需要28文币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    优惠套餐(点此详情)
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、试题类文档,标题没说有答案的,则无答案。带答案试题资料的主观题可能无答案。PPT文档的音视频可能无法播放。请谨慎下单,否则不予退换。
    3、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者搜狗浏览器、谷歌浏览器下载即可。。

    编译原理 词法分析课件.pptx

    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中;这里的内容就是一

    13、段注释;LT,LE等的值在yacc源程序中定义正则定义分隔声明部分和转换规则部分。Lex程序的例子(2)没有返回,表示继续识别其它词法单元把识别到的标识符加入标识符表识别到数字常量,加入常量表Lex程序的例子(3)Lex处理源程序时,辅助函数被直接拷贝到lex.yy.c中 辅助函数可在规则中直接调用Lex中的冲突解决方法 冲突:多个输入前缀与某个模式相匹配,或者一个前缀和多个模式匹配 Lex解决冲突的方法 多个前缀可能匹配时,选择最长的前缀 保证词法分析器把=当作一个词法单元识别 某个前缀和多个模式匹配时,选择列在前面的模式 如果保留字的规则在标识符的规则之前,词法分析器将识别出保留字有穷自动

    14、机 本质上和状态转换图相同 区别 有穷自动机只回答Yes/No 区分为两类:不确定的有穷自动机(Nondeterministic Finite Automata,NFA):边上的标号没有限制,一个符号可出现在离开同一个状态的多条边上,可以做标号 确定的有穷自动机(Deterministic Finite Automata,DFA)对于每个状态以及每个符号,有且只有一条边(某些地方是说:最多只有一条边)。两种自动机都识别正则语言,即对于每个可以用正则表达式描述的语言,就可以用某个NFA或者DFA来识别;反之亦然不确定的有穷自动机 NFA的定义 一个有穷的状态集合S 一个输入符号集合(input

    15、alphabet)转换函数(transition function)对于每个状态和 U中的符号,给出相应的后继状态集合 S中的某个状态s0被指定为开始状态/初始状态(有些定义中可以有多个开始状态)S的一个子集被指定为接受状态NFA的例子 状态集合S=0,1,2,3 开始状态0 接受状态集合3 转换函数:(0,a)0,1 (0,b)0 (1,b)2 (2,b)3相应的图形表示转换表(transition table)表示法 用二维表表示NFA的转换函数 每行对应于一个状态,每列对应于一个输入符号或者。每个条目表示对应的后继状态集合转换表表示法输入字符串的接受 一个NFA接受输入字符串x,当且仅当

    16、对应的转换图中存在一条从开始状态到某个接受状态的路径,该路径中各条边上的标号按顺序组成x(不含 标号)。前面的NFA接受aabb,因为:NFA接受的语言:从开始状态到达接受状态的所有路径的标号串的集合。即:该NFA接受的所有符号串的集合NFA和相应语言的例子 相应的语言:L(aa*|bb*)确定有穷自动机(DFA)一个NFA被称为DFA,如果 没有标号为的转换 对于每个状态s和每个输入符号a,有且仅有一条标号为a的离开s的边 可以高效判断一个串能否被一个DFA接受。每个NFA都有一个等价的DFA。DFA的模拟运行 假设输入符号就是字符;Nextchar读入下一个字符(符号)move给出了离开s

    17、,标号为c的边的目标状态DFA的例子 假设输入为ababb,那么进入的状态序列为0,1,2,1,2,3从正则表达式到自动机的转换 正则表达式可以简洁、精确地描述词法单元的模式 模拟DFA的执行可以高效地进行模式匹配 将正则表达式转换为DFA的步骤:正则表达式到NFA NFA到DFANFA到DFA(子集构造法)(1)基本思想:构造得到的DFA的每个状态和NFA的状态子集对应 DFA读入a1,a2,an后到达的状态对应于从NFA开始状态出发沿着a1,a2,an可能到达的状态集合。在算法中“并行地模拟”NFA在遇到一个给定输入串时可能执行的所有动作。例子 假设考虑上面的NFA能够接受串babb 考虑

    18、从开始状态出发,沿着标号分别为b,ba,bab,babb能到达的可能状态的集合NFA到DFA(子集构造法)(2)理论上,最坏情况下DFA的状态个数会是NFA状态个数的指数多个。但是对于大部分应用,NFA和相应的DFA的状态数量大致相同。NFA到DFA(子集构造法)(3)算法中使用到的基本操作 closure(s):能够从NFA状态s开始,只通过转换到达的NFA状态集合 closure(T):能够从T中某个状态开始,只通过转换到达的NFA状态集合 move(T,a):能够从T中某个状态出发,通过一个标号为a的转换到达的NFA状态集合。NFA到DFA(子集构造法)(4)这个算法实际上是一个搜索过程

    19、;Dstates中的一个状态未加标记表示还没有搜索过它的各个后继。NFA到DFA(子集构造法)(5)计算closure(T)的算法 实际上是一个图搜索过程(只考虑-标号边)。子集构造法的例子(1)A:=closure(0)=0,1,2,4,7B:DtranA,a=closure(move(A,a)=closure(3,8)=1,2,3,4,6,7,8C:DtranA,b=closure(move(A,b)=closure(5)=1,2,4,5,6,7D:DtranB,b=closure(move(B,b)=1,2,4,5,6,7,9子集构造法的例子(2)正则表达式到NFA 基本思想根据正则表达

    20、式的递归定义,按照正则表达式的结构递归地构造出相应的NFA。算法分成两个部分:基本规则处理和单符号的情况 对于每个正则表达式的运算,建立组合相应NFA的方法。转换算法(1)基本规则部分 表达式 表达式a转换算法(2)归纳部分 s|r sr转换算法(3)归纳部分 s*转换得到的NFA的特性 状态数量最多为r中的运算符和运算符分量总数的两倍 因为每个步骤只引入两个状态 有且只有一个开始状态和一个接受状态 除接受状态之外,每个状态要么有一条标号不等于的出边,要么有两条标号为的出边。正则表达式到NFA的例子(1)正则表达式(a|b)*abb 第一个a对应的NFA 第一个b对应的NFA正则表达式到NFA

    21、的例子(2)(a|b)的NFA 第二个a的NFA正则表达式到NFA的例子(3)(a|b)*的NFA词法分析器生成工具的设计 体系结构词法分析器生成工具的功能 生成的词法分析器中包含一个模拟有穷自动机的模块 其余部分由生成工具根据词法规则的描述自动生成,包括 自动机的转换表 和动作相关的代码,适当的时候由模拟器调用。构造自动机时 首先构造出各个模式对应的NFA 然后将这些NFA合并成为一个NFA(根据需要)进行确定化NFA合并的方法 合并方法:引入新的开始状态,并引入从这个开始状态到各个原开始状态的转换。得到的NFA所接受的语言是原来各个NFA的语言的并集。不同的接受状态可代表不同的模式。不仅判

    22、断输入前缀是否NFA的语言,还需要知道对应于哪个模式确定化NFA后的处理 对得到的NFA进行确定化,得到DFA。一个DFA的接受状态对应于NFA状态的集合,其中至少包括一个NFA接受状态 如果其中包括多个对应于不同模式的NFA接受状态,则表示当前的输入前缀对应于多个模式,存在冲突。找出第一个这样的模式,将这个模式作为这个DFA接受状态的输出。例子(1)假设有三个模式 a A1 abb A2 a*b+A3 构造各模式的NFA如右例子(2)合并NFA 2:模式1 6:模式2 8:模式3例子(3)确定化得到如下DFA DFA状态68对应NFA状态集合6,8,对应的模式是abb(第二个模式),而不是a

    23、*b+(第三个模式)运行的方式 模拟DFA,不断读入输入字符串中的字符 直到某一时刻没有后继为止(不是到达某个接受状态)注意:根据本教材的定义,DFA总是有后继的。这里是指DFA进入了死状态,即永远不可能到达接受状态的状态。这样可以找到最长可能的词素。回头查找最后的接受状态,执行相应的动作。如果查不到,报词法错 在回退时,需要同时回退读入的字符DFA状态数量的最小化 一个正则语言可对应于多个识别此语言的DFA。通过DFA的最小化可得到状态数量最少的DFA(不计同构,这样的DFA是唯一的)。两个等价的DFA:都识别(a|b)*abb状态的区分 基本思想是合并等价的状态。状态的可区分 如果存在串x

    24、,使得从状态s1和s2,一个到达接受状态而另一个到达非接受状态,那么x就区分了s1和s2 如果存在某个串区分了s和t,我们说s和t就是可区分的;否则s和t就是不可区分的。不可区分的两个状态就是等价的,可以合并空串区分了E和其它状态bb区分了A和B注意:上面定义中使用的DFA中,对于每个状态/每个符号,有且只有一条出边。DFA最小化算法 把所有可区分的状态分开。区分的过程是一个迭代的过程 基本步骤:区分了接受状态和非接受状态 归纳步骤:如果s和t是可区分的,且s到s、t到t有标号为a的边,那么s和t也是可区分的。最终没有区分开的状态就是等价的。所有的死状态都是等价的。第二步骤:从划分得到的等价类

    25、中选取代表,并重建DFA。最小化算法(分划部分)1.设置初始分划=S-F,F2.迭代,不断分划:for(中的每个元素G)细分G,使得G中的s、t仍然在同一组中 iff 对任意a,s、t都到达中的同一组;new=将中的G替换为细分得到的小组;3.如果new=,令final=,算法完成;否则=new,转步骤2;最小化算法(构造部分)在final的每个组中选择一个状态作代表,作为最小DFA的状态 开始状态就是包含原开始状态的组的代表 接受状态就是包含了原接受状态的组的代表(这个组一定只包含接受状态)转换关系构造如下:如果s是G的代表,而原DFA中s在a上的转换到达t,且t所在组的代表为r,那么最小DFA中有从s到r的、在a上的转换。DFA最小化的例子 初始分划:A,B,C,D E 处理A,B,C,D,b把它细分为A,B,C D。处理A,B,C,b把它细分为A,C B 分划完毕。选取A,B,D和E最为代表,构造得到最小DFA。词法分析器状态的最小化 基本思想和DFA最小化算法相同 差别 语法分析器中的接受状态对应于不同的模式 对应不同模式的接受状态一定是不等价的 初始分划为:所有非接受状态集合+对应各模式的接受状态集合 其余细分的方法和构造的方法均相同。接受状态对应的模式就是原来的模式。例子 增加状态 初始分划:0137,7 247 8,5868


    注意事项

    本文(编译原理 词法分析课件.pptx)为本站会员(晟晟文业)主动上传,其收益全归该用户,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!




    Copyright@ 2017-2037 Www.163WenKu.Com  网站版权所有  |  资源地图   
    IPC备案号:蜀ICP备2021032737号  | 川公网安备 51099002000191号


    侵权投诉QQ:3464097650  资料上传QQ:3464097650
       


    【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。

    163文库