语法分析
- 语法分析方法
- 自下而上:算符优先分析法、LR分析法
- 自上而下:递归下降分析法、预测分析程序

一、自上而下分析
1.1 左递归 & 回溯
1.1.1 面临的问题
- 回溯问题
- 分析过程中,当一个非终结符用某一个候选匹配成功时,这种匹配可能是暂时的
- 因此如果在后续匹配中出错的话,不得不“回溯”

- 文法左递归问题
-
,匹配过程会无限循环下去
-

1.1.2 消除左递归
「消除直接左递归」
- 核心思想:左递归变右递归

- 例题

「消除间接左递归」
- 要求

- 核心思想
- 消除回路中的节点

- 算法

- 例题
S -> Qc | c
Q -> Rb | b
R -> Sa | a
顺序 1:R、Q、S
答案:
S -> abcS' | bcS' | cS'
S' -> abcS' | 空字
顺序 2:S、Q、R
答案:
S -> Qc | c
Q -> Rb | b
R -> bcaR' | caR' | aR'
R' -> bcaR' | 空字
1.1.3 消除回溯
- 消除回溯的核心在于能确定非终结符 A 所有候选可能推出的第一个符号,因此引入 FIRST 集

- 提取左公共因子 —— 令非终结符的所有候选首符集两两不相交

- 由于有一些非终结符会推出空字,因此我们需要定义 FOLLOW 集

1.2 LL(1) 文法
1.2.1 LL(1)定义
- 文法定义
- 第一个 L 表示 “从左到右扫描串”
- 第二个 L 表示 “最左推导”
- 第三个 1 表示 “每一步只需向前查看一个符号”

- LL(1) 分析法
- LL(1) 文法可以对输入串进行有效的无回溯的自上而下分析

1.2.2 FIRST
- 定义

- 求解算法
- 核心思想:用 “对有限产生式的反复扫描” 代替 “穷尽所有推导”
- 构造每个文法符号的 FIREST 集

- 构造任何符号串的 FIRST 集

1.2.3 FOLLOW
- 定义

- 构造每个非终结符的 FOLLOW 集