- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
编译原理课件第6讲LR分析法
第六讲 LR分析法 LR分析概述 LR(0)分析 SLR(1)分析 LR(1)分析 LALR(1)分析 二义性文法在LR分析中的应用 复习:移进-归约分析 在步骤3中,用A→b归约 在步骤5中,用A→Ab归约 问题:何时移进?何时归约?用哪个产生式归约? LR分析器工作过程示意图 LR分析使用两张表 ACTION表 告诉分析器:栈顶状态为S, 当前输入符号是a时做什么 1. ACTION[S,a]= Sj 2. ACTION[S,a]= rj (第j条产生式为A??) 3. ACTION[S,a]= acc 4. ACTION[S,a]= error GOTO表 GOTO[S,A]栈顶状态为S,归约之后的非终结符为A时,要放到栈顶的新状态 问题: 对于一个文法,状态集是如何确定的? LR分析表是如何得到的? 可归前缀与活前缀 活前缀(Viable Prefixes) 定义: S’ ?A? ???是文法G中的一个规范推导,如果符号串γ是??的前缀,则称γ是G的一个活前缀。其中S’是对原文法扩充(S’?S)增加的非终结符. ? 为使S’不出现在任何产生式的右部. 如G=({S},{a},{S?Sa,S?a},S) 则拓广文法G‘=({S,S’},{a},{S’ ?S, S?Sa,S?a},S’) LR分析需要构造识别活前缀的有穷自动机 我们可以把文法的终结符和非终结符都看成有穷自动机的输入符号,每次把一个符号进栈看成已识别过了该符号,同时状态进行转换,当识别到可归前缀时,相当于在栈中形成句柄,认为达到了识别句柄的终态。 如何构造识别活前缀的有限自动机 已经有了活前缀如何构造有限自动机? 活前缀及其可归前缀的一般计算方法 活前缀及其可归前缀的一般计算方法 定义 (非终结符的左文) :文法G,A?VN, LC(A)={? | S’ ?A?, ??V*, ??VT *} 对拓广文法的开始符号S’: LC(S’)={?} 规范推导中在非终结符A左边所有可能出现的符号串的集合。 推论:若文法G中有产生式B→?A?,则有LC(A) ? LC(B)·{?} 因为: S’??B? ???A?? 构造识别活前缀的NFA: 1、把文法的所有产生式的项目都列出,每个项目都为NFA的一个状态2、确定初态、句柄识别态、句子识别态 句柄识别态:圆点在最后的项目 句子识别态:VN仅在产生式左部出现的产生式的句柄识别态 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。( X =? ? A? = ?ε? ?? ) Translation to the DFA 定义转换函数如下:GO(I,X)= CLOSURE(J)其中:I为包含某一项目集的状态, X为一文法符号,X∈VN∪VT 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) SLR(1)分析 大多数适用的程序设计语言的文法不能满足LR(0)文法的条件,即其规范族中会有含有冲突的项目集(状态) 如果解决这种冲突? 直觉:对于有冲突的状态,向前查看一个符号,以确定采用的动作 仍有许多文法构造的LR(0)项目集规范族存在的动作冲突不能用SLR(1)方法解决 LR(1)分析 若项目集[A→??B?]属于I时,则[B→??]也属于I 把FIRST(?)作为用产生式归约的搜索符(称为向前搜索符),作为用产生式B→?归约时查看的符号集合(用以代替SLR(1)分析中的FOLLOW集),并把此搜索符号的集合也放在相应项目的后面,这种处理方法即为LR(1)方
原创力文档


文档评论(0)