自上而下 vs 自下而上
- 自上而下:从开始符号 出发,推导出输入串。(LL 分析、递归下降)
- 自下而上:从输入串出发,规约到开始符号 。(LR 分析)
回溯问题
自上而下分析中,若某非终结符有多个候选式,选择错误则需回退——回溯。
产生回溯的原因:
- 左递归导致死循环
- 候选式 FIRST 集重叠
- 候选式含 且与 FOLLOW 集冲突
左递归消除
消除直接左递归
转换为:
消除间接左递归
算法(代入后消除直接左递归):
- 对非终结符排序
- 对于 从 1 到 :
- 对于 从 1 到 :将 代入 中
- 消除 的直接左递归
- 删除多余产生式
重点 消除直接左递归公式必须掌握。
提取左公因子
若 ,提取 :
FIRST 集
定义: 是从 推导出的所有串的首终结符集合。
计算规则:
- 若 (),则
- 若 ,则
- 若 :
- 将 中非 元素加入
- 若 ,则将 中非 加入
- 依次类推
- 若 ,则
重点 FIRST 集计算规则必须掌握。
FOLLOW 集
定义: 是在所有句型中紧跟在 之后的终结符集合。
计算规则(反复迭代直到不动点):
- 将
$加入 ( 为开始符号) - 若 ,则
- 若 或 且 ,则
重点 FOLLOW 集计算错误导致分析表全错。
关系图法求 FOLLOW 集(辅助方法)
关系图法为 FOLLOW 集计算提供直观的图形化方法:
- 为每个非终结符建立结点
- 若 ,则从 到 中的每个终结符 画边
- 若 或 且 ,则从 到 画边
- 从每个结点出发,沿有向边可达的所有终结符和
$即为该非终结符的 FOLLOW 集
重点 关系图法可辅助 FOLLOW 集计算,但考试推荐用迭代法确保完整。
LL(1) 分析表构造
对每条产生式 :
- 对每个 ,将 填入
- 若 ,则对每个 ,将 填入
LL(1) 分析算法
栈 + 分析表 + 控制程序:
- 初始状态:栈
$S,输入指针指向第一个符号 - 若栈顶 与当前输入 :
- $X = a = $$:接受
- $X = a \neq $$:匹配,弹出栈顶,输入指针前移
- :查表 ,弹出 ,压入
- 表中为空或出错则报错
重点 LL(1) 分析表构造是核心内容,必须掌握考试重点。
递归下降分析法
为每个非终结符编写一个递归函数,函数体根据产生式候选式分支。
- 遇到终结符:匹配输入
- 遇到非终结符:调用对应函数
- 要求:无左递归、FIRST 集两两不相交
悬挂 else 问题
if a then if b then c else d二义性——else 与哪个 if 匹配?
解决:最近匹配原则——else 匹配最近的未匹配 if。
LL(1) 文法判定
重点 分析表无多重定义即为 LL(1) 文法。
LL(1) 文法判定条件(等价):
- 无左递归
- 无回溯条件:对任意 ,
- 若 ,则
无回溯条件是充分非必要条件。