自顶向下的分析
- 通用形式:递归下降分析
- 预测分析不需要回溯
- 不确定的分析:需要回溯的分析
- 预测分析:确定的分析
最左推导
总是选择每个句型的最左非终结符进行替换。
最右推导
-
总是选择每个句型的最右非终结符进行替换。
-
最左归约是最右推导的逆过程,最左归约称为规范归约,而最右推导相应地称为规范推导
-
最左推导和最右推导的唯一性
文法转换
- 消除歧义
- 同一非终结符的多个候选式存在共同前缀,例如S->aAd | aBe
- 无二义性不一定确定性,确定性一定无二义性
- 直接左递归文法、间接左递归文法
- 消除直接左递归 :将左递归转换成了右递归,引进了一些非终结符和产生式
- 消除间接左递归 :
- 提取左公因子
LL(1)文法
-
S文法
-
Q文法
-
FISRT(a): 串首终结符集合
- 相对于串而言
- a能够推出的所有终结符串中位于串首的那些终结符构成
- FOLLOW(A):非终结符的后继符号集
- 相对于非终结符而言
- 可以在某句型中紧跟在A后边的终结符构成的集合
- 计算FOLLOW(A)
LL(1)文法
- LL(1)文法:(针对上下文无关文法而言)
习题解答
预测分析法
实现步骤:
- 构造文法
- 改造文法:消除二义性、消除左递归、消除回溯
- 求每个变量的FIRST集和FOLLOW集,从而求得每个候选式的SELECT集
- 检查是不是LL(1)文法。若是,则构造预测分析表
- 进行递归的预测分析或非递归的预测分析
递归的预测分析法
根据预测分析表为每个非终结符编写递归下降过程
- 根据预测分析表
非递归的预测分析法
根据预测分析表构造一个自动机,也叫表驱动的预测分析
- 预测分析表
对比
错误处理
- 恐慌模式
- 同步词法单元集合
- 如果终结符在栈顶而不能匹配,简单的办法是弹出此终结符
- 分析表使用方法
自底向上分析
- 最左归约,移入归约分析
- 移入-归约存在的问题
错误识别了句柄
- 句柄L句型的最左直接短语
问题
- 为什么这步不用(3)归约