第四章_语法分析4.pptVIP

  • 9
  • 0
  • 约1.47万字
  • 约 77页
  • 2018-06-17 发布于湖北
  • 举报
第四章 语法分析(4) 4.7 LR(1)、LALR 4.6.4 构造SLR分析表 算法 4.32 构造SLR分析表 输入:一个拓广文法G? 输出:G? 的SLR分析表的函数action和goto 方法: 1. 构造G? 的LR(0)项目集规范族C = {I0, I2, …, In}。 2. 对于状态Ii的分析动作如下: (a) 若A?? . aB ? Ii且 goto (Ii ,a)= Ij action[i, a] = “shift j” (b) 若A?? . ? Ii, 对于所有a ? FOLLOW(A) action[i, a] = “reduce A??” , A ? S? (c) 若S??S. ? Ii, action[i, $]= “accept” 3. 若goto(Ii, A) = Ij, A?VN , 则 goto[i,A] = j 4. 分析表其余位置为error 例4.34 每个SLR(1)文法都不是二义的,但是,有许多非二义的文法不是SLR(1)。 例如,下面的产生式文法 S ? L=R S ? R L ? *R L ? id R ? L 拓广文法G?的LR(0)项目集规范族为: SLR(1)文法的描述能力有限 4.6.5 可行前缀(viable prefix) 对于一个文法G,构造一个LR(0)自动机,它能识别所有可能出现在分析栈中的文法符号串,栈中的文法符号串一定是某个右句型的前缀。 不是右句型的所有前缀都会出现在栈中。 可以出现在移进归约分析器栈中的右句型的前缀称为可行前缀。 定义:一个可行前缀是一个右句型的前缀,并且不含右句柄之后的任何符号。 可行前缀后加上终结符可以得到右句型。 只有输入串中已分析过的那部分能归约成可行前缀,就没有语法错误。 事实上,LR(0)自动机是一个识别可行前缀的DFA。 识别G的所有可行前缀的NFA NFA的状态是一个LR(0)项目。 从每个形如B ? ? · X?的状态出发画一条标记为X的弧到状态B??X · ?, 从每个形如B?? · A?的状态出发画一条标记为?的弧到所有形如A? · ?的状态。 这个NFA通过子集构造法得到的DFA和前面构造的LR(0)自动机是相同的。 例:p153 描述文法的可行前缀 S? ? S S ? SS+| SS* | a 识别可行前缀的NFA 识别可行前缀的DFA 有效项目 如果存在一个规范推导S ?*?Aw ? ??1?2w, 则项A??1 · ?2 对可行前缀??1 是有效的。 若项目A??1 · B?2 对可行前缀??1 是有效的,且 B?? 是产生式,则项目 B ? · ? 对可行前缀??1 也是有效的。 例4.35 有效项目集和项目集规范族 文法G的某个可行前缀?的所有有效项目组成的集合,称为可行前缀?的LR(0)有效项目集。 文法G的所有有效项目集组成的集合,称为G的LR(0)项目集规范族。 图4.36 识别可行前缀的 DFA 4.7 构造规范的LR分析表 例 I2有两个项目S?L · =R和R?L · 当下一个输入为‘=’时用R?L · 归约,但是文法没有以R=…开始的右句型,只有以*R=…开始的右句型,可见,仅仅知道可行前缀L不应当进行归约。 扩充项目的定义! LR(1)项目 重新定义项目,让它带上搜索符(向前看符号),成为如下形式 LR(1)项目: 由LR(0)项目和一个lookahead符号组成 [ A??.?, a ] 对于项目[ A??·, a ],搜索符a表示只有当下一个输入符号是a时,才能进行归约。 这样的a的集合一定是FOLLOW(A)的一个子集,可能是真子集。 LR(1)项目[A??·?, a]对可行前缀?有效,如果存在着推导 S ?*rm ?Aw ?rm ???w,其中: ? = ??,且 a是w的第一个符号,或者w为?且a是$。 例4.37 考虑文法: S ? BB B ? aB | b 构造有效的LR(1)项目集 考虑对可行前缀?有效的项目[A?? ·B?, a],必定存在最右推导S ?*rm ?Aax ?rm ??B?ax,其中? = ??。 假设?ax能推出by,那么, [B? ·?, b]对?有效,b是从? 能推出的第一个终结符,或当? 可空时,b就是a。b?FIRST(?a)。 算法4.38 LR(1)项目集的构造 输入:拓广文法G?。 输出: LR(1)项目集规范族,是对G? 的一个或多个可行前缀有效的项目集。 方法:如图4-40所示。 Fig4.40 Sets of LR(1) items c

文档评论(0)

1亿VIP精品文档

相关文档