- 1、本文档共138页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
[工学]编译原理课件chap06陈火旺
第六章 语法分析--LR分析 第六章语法分析——LR分析 LR分析概述 LR(k)分析是根据当前分析栈中的符号串和向右顺序查看输入串的k(k≥0)个符号就可以唯一确定分析的动作是移进还是归约以及用哪个产生式归约。 从左到右扫描(L)自底向上进行规约(R) (是规范规约) LR分析的优缺点 1)适合文法类足够大,适用于大多数上下文无关文法 2)分析效率高 3)报错及时 4)手工实现工作量大 5)可以自动生成 美国Bell实验室推出的编译程序自动构造工具——YACC:能接受一个用BNF描述的满足LALR(1)上下文无关文法并对其自动构造出LALR(1)分析器。 LR分析器模型 LR分析算法 置ip指向输入串w的第一个符号 令S为栈顶状态 a是ip指向的符号 重复 begin if ACTION[S,a]=Sj then begin PUSH j,a(进栈) ip 前进(指向下一输入符号) end else if ACTION[S,a]=rj (第j条产生式为A??) LR分析算法 then begin pop |?| 项 令当前栈顶状态为S’ push GOTO[S’,A]和A(进栈) end else if ACTION[s,a]=acc then return (成功) else error end.重复 自底向上分析法的关键问题是在分析过程中如何确定句柄。LR方法中的句柄是通过求可归前缀而求得。 活前缀的定义及在LR分析中的应用 G=(Vn,Vt,P,S),若有S’ ? αAω ? αβω, A ? β ( β是句柄 ) γ是αβ的前缀,则称是文法G的活前缀 活前缀是规范句型的前缀,不包含句柄之后的任何符号 αβ是含句柄的活前缀,并且句柄是αβ的后端,则称αβ是可归前缀或可规范前缀。 在LR分析过程中,实际上是把αβ的前缀(即文法G的活前缀)列出放在符号栈中,一旦在栈中出现αβ(形成可归前缀),即句柄已经形成,则用产生式A ? β进行归约。 LR分析法如何分析句子? 移进归约(从左到右扫描(L)自底向上进行规约(R) ) 移进归约的关键问题是什么? 判断符号栈顶的符号串是否构成句柄。 LR分析法如何识别句柄? LR分析法在分析过程中并不是直接分析符号栈中的符号是否形成句柄,而是通过识别可归前缀来识别句柄。 具体地,LR分析法的分析过程可以看作识别活前缀和可归前缀的过程,只要符号栈中的符号串构成活前缀,就表示已分析过的部分是正确的,继续移进;直到符号栈中的符号串构成可归前缀,则表示当前栈顶符号串已形成句柄,则进行归约。 如何识别活前缀和可归前缀? 通过有限自动机来识别。 如何构造识别活前缀和可归前缀的有限自动机? 根据文法规则 状态集合:列出所有活前缀的识别状态 符号表:所有的终结符和非终结符 状态转换函数: f(Ki ,a)= Kj 某一个活前缀的识别状态,在输入符号表中的一个符号之后,转向另一个活前缀的识别状态。 终态集:所有可归前缀的识别状态 LR(0)分析 构造LR分析器的关键是构造其分析表 构造LR分析表的方法是: (1)根据文法构造识别规范句型活前缀的有穷自动机DFA (2)由DFA构造LR分析表 LR(0)分析 确定状态集合 每一个状态对应文法中某一个产生式规则的某一个项目 每一个产生式规则的每一个项目代表一个活前缀的识别状态。 产生式规则的项目? 活前缀与句柄的关系: G[S]: 若S = αAω =αβω r是αβ的前缀,则 称r是G的一个活前缀 1.活前缀已含有句柄的全部符号,表明产生式A→β的 右部β已出现在栈顶 2.活前缀只含句柄的一部分符号表明A→β1β2的右部子串β1已出现在栈顶,期待从输入串中看到β2推出的符号 3. 活前缀不含有句柄的任何符号,此时期望A→β的右部所推出的符号串 活前缀,与句柄 ,与 LR(0)项目 为刻划这种分析过程中的文法G的每一个产生式的右部符号已有多大一部分被识别(出现在栈顶)的情况,分别用标有圆点的产生式来指示位置。 A→β.刻划产生式A→β的 右部β已出现在栈顶 A→β1.β2 刻划A→β1β2的右部子串β1已出现在栈顶,期待从输入串中看到β2推出的符号 A→.β 刻划没有句柄的任何符号在栈顶,此时期望A→β的右部所推出的符号串 对于A→ε的LR(0)项目只有A→. LR(0)分析表的构造 LR(0)分析表由两部分组成: 动作表表示当前状态下面临输入符号应做的动作是移进、归约、接受或出错; 状态转换表表示在当前状态下面临文法符号时应转向的下一个状态。 三、SLR(1)分析表
文档评论(0)