第五章 自说顶向下语法分析方法.pptVIP

  • 2
  • 0
  • 约1.7万字
  • 约 88页
  • 2019-03-09 发布于福建
  • 举报
第五章 自说顶向下语法分析方法

* 自顶向下语法分析方法 * 算法归结 (1) 以某种顺序将文法非终结符排列A1 ,A2 …An (2) for i:=1 to n do begin for j:=1 to i-1 do 若Aj的全部产生式为: Aj ? ?1| ?2|…| ?k 替代形如Ai ? Ajr的产生式变为: Ai? ?1r| ?2r|…| ?kr end 消除Ai规则的一切直接左递归; end; (3)去掉无用产生式 * 自顶向下语法分析方法 * 例如:有文法的产生式为: (1) S ?Qc|c (2) Q ?Rb|b (3) R ?Sa|a 该文法的每个非终结符为间接左递归。 若非终结符排序为S、Q、R。 左部为S的产生式(1)无直接左递归,(2)中右部不含S,所以把(1)右部代入(3)得: (4) R ?Qca|ca|a 再将(2)的右部代入(4)得: (5) R ?Rbca|bca|ca|a对(5)消除直接左递归得: * 自顶向下语法分析方法 * (5) R ?Rbca|bca|ca|a对(5)消除直接左递归得: R ?(bca|ca|a)R’ R’ ?bcaR’|ε 最终文法变为: S ?Qc|c Q ?Rb|b R ?bcaR’|caR’|aR’ R’ ?bcaR’|ε * 自顶向下语法分析方法 * 5.4 不确定的自顶向下分析思想 假定要被代换的最左非终结符号是B,且有n条规则:B→A1|A2|…|An,那么如何确定用哪个右部去替代B? LL(1)文法:确定的自顶向下分析法:根据规则的选择集合来确定。 非LL(1)文法:不确定的自顶向下分析法-带回溯的自顶向下分析法 “不确定”的意思:当某个非终结符的产生式有多个候选,而面临当前的输入符号无法确定选用哪个产生式,从而引起回溯。 * 自顶向下语法分析方法 * 下面讲三个例子说明回溯: 1、由于相同左部的产生式的右部First集交集不为空而引起回溯。 例:文法S?xAy A?ab|a 求输入串为xay语法树。 * 自顶向下语法分析方法 * 例:文法S?xAy A?ab|a 求输入串为xay语法树。 first(ab)与first(a)的交集不为空 S x A y S x A y a b S x A y a 回溯 S?xAy 若选择A?ab,就于xay不匹配 回溯,用A?a就匹配 * 自顶向下语法分析方法 * 2、由于相同左部非终结符的右部能??,且该非终结符Follow集中含有其右部First集的元素而引起回溯。 例:S ? aAS |b A ?bAS |? 求对输入串ab#的推导树。 * * 自顶向下语法分析方法 * 例:S ? aAS |b A ?bAS |? 求对输入串ab#的推导树。 A?? Follow(A)={a,b} first(bAs)={b} S a A S b A S 回溯 S a A S S a A S b ? * 自顶向下语法分析方法 * 3、由于文法含有左递归而引起回溯 例:S?Sa S?b 若推导baa# * 自顶向下语法分析方法 * 例:S?Sa S?b 若推导baa# S b S S a 回溯 S S a b 回溯 S S a S a S S a S a b 消除左递归后,再试一遍 * 自顶向下语法分析方法 * 由以上例子可以看出:带回溯的自顶向下分析是一个试探过程,当分析不成功时则推翻分析,退回到适当位置再重新试探其余可能的推导。 因此,需要记录所选过的产生式,直到把所有可能的推导序列都试完仍不成功,才能确认输入串不是该文法的句子。(为证明输入串不合法,需要穷举或遍历所有的推导) 编译程序真正实现时往往边分析边插入语义动作,因而带回溯分析代价很高,效率很低,在实用编译程序中几乎不用。 * 自顶向下语法分析方法 * 5.5 确定的自顶向下分析方法 1、递归子程序法: 要求文法满足LL(1)文法。是比较简单直观易于构造的一种语法分析方法。 PL/0编译程序的语法分析部分就是采用的递归子程序法。 基本思想是:对应文法中每个非终结符编写一个递归过程,每个过程的功能是识别由该非终结符推出的串。 * 自顶向下语法分析方法 * 例:递归子程序实现表达式的语法分析 表达式的EBNF 〈表达式〉∷=[+|-]〈项〉{(+|-)〈项〉} 〈项〉∷=〈因子〉{(*|/)〈因子〉} 〈因子〉∷=ident|number|‘(’〈表达式〉‘)’ * 自顶向下语法分析方法 * 〈表达式〉∷=[+|-]〈项〉{(+|-)〈项〉} procedure expr; begin if sym in [ plus, minu

文档评论(0)

1亿VIP精品文档

相关文档