自上而下的语法分析

自上而下语法分析,内容包括如何将文法转变为 LL(1) 文法,以及如何判断 LL(1) 文法,构造预测分析表

进行自上而下的语法分析,基于文法是 LL(1) 文法。分为递归下降的预测分析和非递归下降的预测分析。

#提取左公因子

对产生式组 $$A \rightarrow \alpha | \alpha b_1 | \alpha b_2 | \ldots | \alpha b_m | \gamma_1 | \gamma_2 | \ldots | \gamma_p$$

用如下产生式组替换:

$$A \rightarrow \alpha A ^ { \prime } \left| \gamma _ { 1 } \right| \gamma _ { 2 } | \ldots | \gamma _ { p }$$

$$A ^ { \prime } \rightarrow \varepsilon | b _ 1| b _ 2 | \dots | b _ { \mathrm { m } }$$

#消除左递归

对产生式组

$$A \rightarrow A \alpha _ { 1 } | A \alpha _ { 2 } | \cdots | A \alpha _ { n } | \beta _ { 1 } | \beta _ { 2 } | \ldots | \beta _ { m }$$

用如下产生式组替换:

$$A \rightarrow \beta _ { 1 } A ^ { \prime } | \beta _ { 2 } A ^ { \prime } | \ldots | \beta _ { m } A ^ { \prime }$$

$$A ^ { \prime } \rightarrow \alpha _ { 1 } \mathrm { A ^ { \prime } } | \alpha _ { 2 } \mathrm { A ^ { \prime } } |\ldots | \alpha _ { \mathrm { n } } \mathrm { A ^ { \prime } } | \varepsilon$$

Tips: 消除左递归并非一定产生等价的 LL(1)文法。

🌰$S\rightarrow Aa \mid b, A\rightarrow SB, B\rightarrow ab$

  • 如果把A的产生式代入S的产生式得到等价文法是LL(1)的。
  • 如果把S的产生式代入A的产生式得到等价文法不是LL(1)的。

#LL(1)文法

第一个 L 代表从左到右扫描输入串,第二个 L 代表最左推导,1 表示分析的每一步只需向前查看一个符号。

LL(1) 文法具有无二义性、无左公因子、无左递归的性质。对于文法的任何非终结符,使用它匹配输入串时,能够根据所面临的输入符号准确的选择产生式,如果该产生式匹配成功,那么这个匹配不是虚假匹配,如果该产生式匹配不成功,则用其他的产生式也一定不会匹配成功。

#判断一个文法是否是 LL(1) 文法

对于文法中的任何两个产生式 $A\rightarrow\alpha\mid\beta$,满足:

  • $FISRT(\alpha) \bigcap FISRT(\beta) = \varnothing$
  • 如果 $\beta\Rightarrow^*\varepsilon$,那么 $FISRT(\alpha)\bigcap FOLLOW(\beta)=\varnothing$

#非递归分析预测分析表的构建

  • 对文法的每个产生式 $A\rightarrow\alpha$,执行第二步和第三步。
  • 对 FIRST($\alpha$) 的每个终结符 a,把 $A\rightarrow\alpha$ 加入 M[A, a](即加入表中 A 行 a 列)。
  • 如果 $\varepsilon$ 在 FIRST($\alpha$) 中,对 FOLLOW(A) 的每个终结符 b(包括💲), 把 $A\rightarrow\alpha$ 加入 M[A, b]。
  • M的其它没有定义的条目都是 error。
updatedupdated2022-05-042022-05-04