- 10
- 0
- 约9.52千字
- 约 33页
- 2017-02-02 发布于湖北
- 举报
第七章LR分析 7.1 LR概述 7.2 LR(0)分析 7.3 SLR(1)分析 7.4 LR(1)分析 7.5 LALR(1)分析 7.6 二义文法在LR分析中的应用 7.2 LR(0) 分析 例子:可归前缀与活前缀 例 G[S]为: S ?aAcBe[1] A ?b[2] A ?Ab[3] B ?d[4] 最右推导: S= aAcBe[1]=aAcd[4]e=aAb[3]cde=a b[2]bcde 最左归约(逆过程) : a b[2]bcde=aAb[3]cde=aAcd[4]e = aAcBe[1]= S 用哪个产生式归约取决于当前句型的前部。 每次可归约前句型的前部依次为: ab[2], aAb[3], aAcd[4], aAcBe[1] ------ 称为可归前缀 在规范句型中形成可归前缀之前(包括可归前缀)的所有前缀 ------ 称活前缀 识别活前缀的NFA (1)活前缀的形式定义 活前缀与句柄 活前缀与项目 为刻划这种分析过程中的文法G的每一个产生式的右部符号已有多大一部分被识别(出现在栈顶)的情况,分别用标有圆点的产生式来指示位置。 A→α.刻划产生式A→α的右部α已出现在栈顶 A→α1.α2 刻划A→α1α2的右部子串α1已出现在栈顶,期待从输入串中看到α2推出的符号 A→.α 刻划没有句柄的任何符号在栈顶,此时期望A→α的右部所推出的符号串 项目或配置(item or configuration) ---在右端某一位置有圆点的G的产生式 LR(0)项目 如:A? xyz 则有项目 A?.xyz A?x.yz A?xy.z A?xyz. 如:S→aAd 则有项目 S→.aAd S→a.Ad S→aA.d S→aAd. 对于 A→ε LR(0)项目只有A→? (2)构造识别文法活前缀DFA的3种方法 第1种:形式定义法 第2种:NFA确定法 第3种:项目集规范族法 第1种方法:形式定义法 启示: LR(0)分析使用的信息之一是句柄左部 的内容. 定义(非终结符的左文) LC(A)={? | S’??A?, ??V*, ??Vt*}, 对拓广文法的开始符号S’: LC(S’)={?} 若有B??A? 则:LC(A)?LC(B).{?}因为: S’??B? ???A ? ? G[S]: (0) S’?S (1) S ?a A c B e (2)A ?b (3) A ?Ab (4)B ?d 每个非终结符的左文方程组 LC(S’)={?} LC(S)=LC(S’).{?} LC(A)=LC(S).{a}? LC(A){?} LC(B)=LC(S).{aAc} 简写为: [S’]= ? [S]=[S’] [A]=[S]a+[A] [B]=[S]aAc 用代入法求解得: [S’]= ? [S]= ? [A]=a+[A] [B]=aAc 令 ?={[S’],[S],[A], [B],a,A,c} 则方程两边都是?上的正规式 而[A]=a+[A] 即为 [A]=a | [A] 由正规式所表示的正规集 得: [A]=a G[S]: (0) S’?S (1) S ?a A c B e (2)A ?b (3) A ?Ab (4)B ?d 定义(产生式的LR(0)左文) LR(0)LC(A??)={?| ? =??且S’??A?? ???, ??Vt*} 有推论:LR(0)LC(A ??)=LC(A).{?} [S’]= ? [S]= ? [A]=a [B]=aAc 则有: LR(0)LC(S’?S)=S LR(0)LC(S?aAcBe)=aAcBe LR(0)LC(A?b)=ab LR(0)LC(A?Ab)=aAb LR(0)LC(B?d)=aAcd ? (=Vn?Vt)上的正规式 第2种方法:构造识别活前缀的NFA 由于S`仅在第一个产生式的左部出现,因此规定项目1为初态,其余每个状态都为活前缀的识别态,圆点在最后的项目为句柄识别态,第一个产生式的句柄识别态为句子识别态。 状态之间的转换关系确定方法为如下: 若i项目为:X→X1X2…Xi-1 ?Xi…Xn j项目为:X→X1X2…Xi-1 Xi ? Xi+1 …Xn i项目和j项目出于同一个产生式。对应于NAF为状态j的圆点只落后于状态i的圆点一个符号的位置,那么从状态i到状态j连一条标记为Xi的箭弧。 如果Xi为非终结符,则一定
原创力文档

文档评论(0)