[工学]05语法分析3-LR0_2.pptVIP

  • 9
  • 0
  • 约1.27万字
  • 约 65页
  • 2018-03-27 发布于浙江
  • 举报
[工学]05语法分析3-LR0_2

第5单元 语法分析 —— 自下而上分析法 四种动作 移进:表示栈顶尚未形成句柄,需要继续移进符号以形成句柄。 action[Sm, ai]=Sj:表示当前栈顶状态为Sm,输入符号为ai,则应将ai ?符号栈,同时将Sj ?状态栈。 归约:若当前栈顶符号串已构成句柄,则立即进行归约。 LR实质: LR(0)分析步骤 一、拓广文法 二、LR(0)项目 根据活前缀定义,一个规范句型的活前缀不含有句柄右边符号。因此,句柄和活前缀的关系有三种: 活前缀中含有句柄的全部符号(最长活前缀),即构成可归前缀。表明栈顶已形成某产生式的候选式,可进行规约; 活前缀中含有句柄的部分符号。表示某候选式的子串已出现在栈顶,但还需要继续读入符号; 活前缀中不含有句柄中的任何符号。 三、构造NFA→DFA 定义:设P → α·Xβ是文法G的一个LR(0)项,其中X是G的任意符号,则称P → αX·β是其后继项,X是其后继符号。 直观上看,后继项是把项中圆点右移一个符号位置所得的项。从句型识别的角度看这是显然的:当扫描过的输入符号已与产生式右部的α匹配时,后继的输入符号应该期望与产生式右部后继的符号X项匹配。 为了构造识别文法G的所有活前缀的有限自动机,需要介绍两个集合函数:项集I的闭包closure(I)和状态转换函数GO(I, X)。文法G的LR(0)项的集合称为LR(0)项集,简称项集。 四、构造LR(0)项目集规范族 P124 算法5.7 function closure (I) /* I 是项目集*/ { J= I; do{ 对于 closure (I)中的每个项目A ?? .B ?和产生式B? ? , 若B? .? 不在closure (I)中,则 把 B? .? 加到closure (I)中; }while(再没有项目加到J中); return J; }; 补例 1 已知G[S]如下: S ?aAcBe A ?b A ?Ab B ?d 其次,由产生式得到各个项目: S→ .S S→ S. S → .aAcBe S → a.AcBe S → aA.cBe S → aAc.Be S → aAcB.e S → aAcBe. A → .b A → b. A → .Ab A → A.b A → Ab. B → .d B → d. 下面求解项目集规范族C: 1. 首先,I0=closure({S→.S})={S→.S,S→.aAcBe} 用I0初始化C,此时,C={I0} 2. 第一次考察C中的项目集I。此时仅有I=I0,求GO(I0,X),X为文法的任一个符号: GO(I0,S) =closure({S→S.})= {S→S.} = I1 GO(I0,A)=closure({})={} 空 GO(I0,B) =closure({})={} 空 GO(I0,a) =closure({S→a.AcBe}) = {S→a.AcBe,A→.b,A→.Ab} = I2 GO(I0,b) =closure({})={} 空 GO(I0,c) =closure({})={} 空 GO(I0,d) =closure({})={} 空 GO(I0,e) =closure({})={} 空 此时,C={I0,I1,I2} 3. 第二次考察C中的项目集I。此时C中有三个项目集:I0、I1、I2。 显然,对I0不用重复考虑,下面首先考察 I1= {S→S.}: GO(I1,S) =closure({})={} 空 GO(I1,A)=closure({})={} 空 GO(I1,B) =closure({})={} 空 GO(I1,a) =closure({})={} 空 GO(I1,b) =closure({})={} 空 GO(I1,c) =closure({})={} 空 GO(I1,d) =closure({})={} 空 GO(I1,e) =closure({})={} 空 可见,对I1的考察没有扩大C。 再考察 I2= {S→a.AcBe,A→.b,A→.Ab}: GO(I2,S) =closure({})={} 空 GO(I2,A)=closure({S→aA . cBe, A→A

文档评论(0)

1亿VIP精品文档

相关文档