130 likes | 282 Views
简单优先分析方法. 一种 shift-reduce 分析方法 根据文法符号的优先关系确定句柄 文法符号的优先关系的确定. 简单优先分析中的三种关系. X Y : 当且仅当存在一个产生式 A→ … XY … X ⊳ Y : 当且仅当存在一个产生式 A→ … XB … 并有 B + Y … 。 X ⊲ Y : 当且仅当存在一个产生式 A→ … BC … 并有 B + … X,C * Y … 。 文法 G 为 简单优先文法 如果满足: 对于任意两个语法符号 X 和 Y, 至多成立一种
E N D
简单优先分析方法 • 一种shift-reduce分析方法 • 根据文法符号的优先关系确定句柄 • 文法符号的优先关系的确定
简单优先分析中的三种关系 • X Y :当且仅当存在一个产生式A→…XY… • X ⊳ Y :当且仅当存在一个产生式A→…XB… 并有B+Y…。 • X ⊲ Y :当且仅当存在一个产生式A→…BC… 并有B+…X,C*Y…。 • 文法G为简单优先文法如果满足: 对于任意两个语法符号X和Y,至多成立一种 优先关系; 任意两个产生式都具有不同的右部。
文法优先关系的确定 • FIRST(W) ={S | W + S…,S(VNVT)} • LAST(W) ={S | W + …S,S(VN VT)} • 若有U…SiSj…: 则有Si Sj ; • 若有U…SiW…:任SjFIRST(W),有Si⊳ Sj • 若有U…VW…:任SiLAST(V), Sj(FIRST(W) {W})则有Si ⊲Sj 输入流的结束标志 ‘#’,文法的开始符为Z, • SFIRST(Z),有#⊳S,; 且#⊳Z • SLAST(Z),有S⊲#,; 且Z⊲#
Z M L FIRST b a ( M ( a LAST b aL ) ) Z M L b ( a ) # Z M L b ( a ) # • 例: Z bMb M a M (L L Ma) ⊲ ⊲ ⊲ ⊳ ⊳ ⊲ ⊳ ⊳ ⊳ ⊲ ⊲ ⊲ ⊲ ⊳ ⊳
简单优先分析算法要点 • 找第一个使Sj⊲Sj+1的Sj • 从Sj开始往前(左)找第一个使Si-1⊳Si的Si • 用SiSi+1…Sj去查产生式的右部,并用相应的左部符号代替句柄SiSi+1…Sj (归约)。 • 重复上述过程,直至输入符结束。如果归约出文法的开始符号则成功。否则失败。
符号栈 关系 输入流 # ⊳b ( a a ) b # # b ⊳ ( a a ) b # # b ( ⊳ a a ) b # # b ( a ⊲ a ) b # # b ( M a ) b # # b ( M a ) b # # b ( M a ) ⊲ b # # b ( L ⊲ b # # b M b # # b M b ⊲ # # Z ⊲ # 简单优先分析实例
二义性文法的处理 • 任何语法分析方法都拒绝二义性,会引 起分析动作的不确定。 • 解决二义性的方法: 改变文法,消除二义性。 增加额外的规则 • 利用二义性简化语法分析
例条件语句定义: [i] S if E then S else S [j] S if E then S • 表达式文法: E E + E E E * E E id E ( E )
第四章总结 • 上下文无关文法(CFG) : (VN,VT,S,P) • 语法分析树:二义性文法,句柄 • 文法分析算法:三个集合的定义及求法 • 语法分析作用:目的是判定输入串是否为文法所接受的语言
语法分析方法 • 自顶向下分析: 思想:从文法开始符出发,适当选择产生式, 力图推导出输入串。 关键问题:产生式的选择 主要方法: 递归下降法 LL(1)分析方法 等价变换:消除公共前缀,消除左递归 分析条件:分析方法:分析过程:
自底向上分析: 思想:从输入串出发,从左到右进行归约, 直至归约出文法的开始符。 关键问题:何时归约、归约产生式的选择 主要分析方法-LR分析方法: LR(0) SLR(1) LR(1) LALR(1) 简单优先分析方法 :优先关系矩阵 LR分析方法比较: LRSM的构造(展望符的计算): 判断分析条件: 构造分析表: 分析过程:
LR分析方法的比较 • 状态数: LR(0)=SLR(1)=LALR(1)<LR(1) • 展望符的确定: LR(0)无展望符;SLR(1)利用Follow集解 决冲突;LR(1)针对不同位置确定展望符, LALR(1)利用合并/传播方法计算展望符。 • 分析能力: LR(0) < SLR(1) < LALR(1) < LR(1) • 应用: LALR(1)较通用,LR(1)属于理论方法。
习题 • 写出如下文法的递归下降分析程序和LL(1)分析表 P → begin d;X end X → d;X | sY Y → ;sY | • 有文法如下: G1:SAa| bAc| dc| bda Ad G2:SAa| bAc| Bc| bBa Ad Bd 证明G1是LALR(1)文法但不是SLR(1)文法,并构造 LALR(1)分析表;G2是LR(1)文法但不是LALR(1)文 法并构造LR(1)分析表。 • 判断文法是否是简单优先文法(判断是否有多重定义) SA/ AAa AAS A/