1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第六讲 LR分析法 LR分析概述 LR(0)分析 SLR(1)分析 LR(1)分析 LALR(1)分析 二义性文法在LR分析中的应用 复习:移进-归约分析 在步骤3中,用A→b归约 在步骤5中,用A→Ab归约 问题:何时移进?何时归约?用哪个产生式归约? LR分析器工作过程示意图 问题: 对于一个文法,状态集是如何确定的? LR分析表是如何得到的? 可归前缀与活前缀 活前缀(Viable Prefixes) 定义: S’ ?A? ???是文法G中的一个规范推导,如果符号串γ是??的前缀,则称γ是G的一个活前缀。 LR分析需要构造识别活前缀的有穷自动机 把文法的终结符和非终结符都看成有穷自动机的输入符号,每次把一个符号进栈看成已识别过了该符号,同时状态进行转换,当识别到可归前缀时,相当于在栈中形成句柄,认为达到了识别句柄的终态。 如何构造识别活前缀的有限自动机 已经有了活前缀如何构造有限自动机? 活前缀及其可归前缀的一般计算方法 构造识别活前缀的NFA: 1、把文法的所有产生式的项目都引出,每个项目 都为NFA的一个状态 2、确定初态、句柄识别态、句子识别态 3、确定状态之间的转换关系 *若项目i为 X → X1X2...Xi-1 ? Xi...Xn 项目j为 X → X1X2...Xi-1 Xi ? Xi+1...Xn 则从状态i到状态j连一条标记为Xi的箭弧 *若i为X →? ? A?,k为A → ? ?,则从状态i画标 记为 ? 的箭弧到状态k Translation to the DFA 定义转换函数如下: GO(I,X)= CLOSURE(J) 其中:I为包含某一项目集的状态,X为一文法符号 J={任何形如A→?X ? ?的项目| A→? ? X ?属于I} 总结:构造识别文法活前缀DFA的三种方法 一、根据形式定义求出活前缀的正规表达式,然后由此正规表达式构造NFA再确定化为DFA 二、求出文法的所有项目,按一定规则构造识别活前缀的NFA再确定化为DFA 三、使用闭包函数(CLOSURE)和转向函数(GO(I,X))构造文法G’的LR(0)的项目集规范族,再由转换函数建立状态之间的连接关系得到识别活前缀的DFA LR(0)文法: LR(0)文法:若其LR(0)项目集规范族不存在 移进-归约,或归约-归约冲突,称为LR(0)文法。 LR(0)分析表的构造 LR(0)分析表相当于识别活前缀的有限自动机DFA的状态转换矩阵 LR(0)分析表的构造算法(书上p135) LR(0)分析器的工作过程(书上p136) 例:对文法G[E]构造出LR(0)分析表: E → aA | bB A → cA | d B → cB | d SLR(1)分析 大多数适用的程序设计语言的文法不能满足LR(0)文法的条件,即其规范族中会有含有冲突的项目集(状态) 如果解决这种冲突? 直觉:对于有冲突的状态,向前查看一个符号,以确定采用的动作 仍有许多文法构造的LR(0)项目集规范族存在的动作冲突不能用SLR(1)方法解决 LR(1)分析 若项目集[A→??B?]属于I时,则[B→??]也属于I 把FIRST(?)作为用产生式归约的搜索符(称为向前搜索符),作为用产生式B→?归约时查看的符号集合(用以代替SLR(1)分析中的FOLLOW集),并把此搜索符号的集合也放在相应项目的后面,这种处理方法即为LR(1)方法 1)构造LR(1)项目集的闭包函数 a) I的项目都在CLOSURE(I)中 b) 若[A→? ? B?, a ] ? CLOSURE(I),B→ ?是文法的产生式,??V*,b?FIRST(?a),则[B→? ?,b]也属于CLOSURE(I) c) 重复b)直到CLOSURE(I)不再扩大 2)转换函数的构造 GO(I,X)= CLOSURE(J) 其中:I为LR(1)的项目集,X为一文法符号 J = { 任何形如[A→?X ? ?,a]的项目 | [A→? ? X ?,a]属于I } LR(1)分析表的构造 1) 若项目[A→? ? a?,b]属于Ik,且转换函数GO(Ik,a)= Ij ,当a为终结符时,则置ACTION[k,a]为Sj 2) 若项目[A→? ? ,a]属于Ik ,则置ACTION[k,a] = rj ,j为产生式在文法G‘中的编号 3) 若GO(Ik,A)= Ij ,则置GOTO[k,A]=j,其中A为非终结符,j为某一状态号 4) 若项目[S‘→S ? ,#]属于Ik ,则置ACTION[k,#] = acc 5) 其它填上“报错标志” LR(1)项目集的构造对某些同心集的分裂可能使状

文档评论(0)

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

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

1亿VIP精品文档

相关文档