自上而下 vs 自下而上

  • 自上而下:从开始符号 出发,推导出输入串。(LL 分析、递归下降)
  • 自下而上:从输入串出发,规约到开始符号 。(LR 分析)

回溯问题

自上而下分析中,若某非终结符有多个候选式,选择错误则需回退——回溯

产生回溯的原因:

  • 左递归导致死循环
  • 候选式 FIRST 集重叠
  • 候选式含 且与 FOLLOW 集冲突

左递归消除

消除直接左递归

转换为:

消除间接左递归

算法(代入后消除直接左递归):

  1. 对非终结符排序
  2. 对于 从 1 到
    • 对于 从 1 到 :将 代入
    • 消除 的直接左递归
  3. 删除多余产生式

重点 消除直接左递归公式必须掌握。

提取左公因子

,提取

FIRST 集

定义 是从 推导出的所有串的首终结符集合。

计算规则

  1. ),则
  2. ,则
    • 中非 元素加入
    • ,则将 中非 加入
    • 依次类推
    • ,则

重点 FIRST 集计算规则必须掌握。

FOLLOW 集

定义 是在所有句型中紧跟在 之后的终结符集合。

计算规则(反复迭代直到不动点):

  1. $ 加入 为开始符号)
  2. ,则
  3. ,则

重点 FOLLOW 集计算错误导致分析表全错。

关系图法求 FOLLOW 集(辅助方法)

关系图法为 FOLLOW 集计算提供直观的图形化方法:

  1. 为每个非终结符建立结点
  2. ,则从 中的每个终结符 画边
  3. ,则从 画边
  4. 从每个结点出发,沿有向边可达的所有终结符和 $ 即为该非终结符的 FOLLOW 集

重点 关系图法可辅助 FOLLOW 集计算,但考试推荐用迭代法确保完整。

LL(1) 分析表构造

对每条产生式

  1. 对每个 ,将 填入
  2. ,则对每个 ,将 填入

LL(1) 分析算法

栈 + 分析表 + 控制程序:

  1. 初始状态:栈 $S,输入指针指向第一个符号
  2. 若栈顶 与当前输入
    • $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) 文法判定条件(等价):

  1. 无左递归
  2. 无回溯条件:对任意
  3. ,则

无回溯条件是充分非必要条件。