四、自上而下的语法分析

### 语法分析
  • 语法分析是编译过程的核心部分。它的任务是在词法分析识别出单词符号串的基础上,分析并判定程序的语法结构是否符合语法规则
  • 按照语法分析树建立的方法,把语法分析分为两大类:
    1. 自上而下的语法分析
    2. 自下而上的语法分析

自上而下的语法分析

\(\star\)自上而下分析面临的问题

1. 文法左递归问题 \(\rightarrow\) 解决方法:转换为右递归
2. 回溯问题 \(\rightarrow\) 解决方法:提取公共左因子

\(\star\star\) 终结首符集 $ FIRST$ 集合

对于 \(A \rightarrow \alpha\)

  1. $ \alpha$ 为终结符,\(FIRST(\alpha)=\{\alpha \}\)
  2. $ \alpha$ 为非终结符,
    • 若 $\alpha \rightarrow a\beta $,则 \(FIRST(\alpha)=\{a\}\)
    • 若 $\alpha \rightarrow ε $,则 \(FIRST(\alpha)=\{ε\}\)
  3. $ \alpha \rightarrow \beta_{1} \beta_{2}… \beta_{n} $
    • \(\beta_{1}\) 是非终结符,\(FIRST(\beta_{1})-\{ε\} \in FIRST(\alpha)\)
    • \(\beta_{1} \beta_{2}… \beta_{i} (1 \le i \le n-1)\) 均为非终结符,且都能推导出 \(ε\) ,则 \(FIRST(\beta_{1}),FIRST(\beta_{2})^…FIRST(\beta_{i+1})\) 中一切非 \(ε \in FIRST(\alpha)\)
    • \(\beta_{1} \beta_{2}… \beta_{n}\) 都能推导出 \(ε\) ,则 \(ε \in FIRST(\alpha)\)

\(\star\star\) 随符集 $ FOLLOW$ 集合

  1. 对于文法开始符号 \(S\)\(\# \in FOLLOW(S)\)
  2. \(B \rightarrow \alpha A \beta\) ,则 \(FIRST(\beta)-ε \in FOLLOW(A)\)
  3. 若 $B \rightarrow \alpha A $,或 $ B \rightarrow \alpha A \beta (\beta \stackrel{+}{\rightarrow}ε)$ ,则将 \(FOLLOW(B) \in FOLLOW(A)\)

构造预测分析表

终结符和#
非终结符

\(A \rightarrow \alpha_{1}|…|\alpha_{n}\) ,对于 $A \rightarrow \alpha_{i} $

  1. \(FIRST(\alpha_{i})=a\),则 \(M[A,a]\) 处填入此产生式
  2. \(FIRST(\alpha_{i})=ε\),则求 \(FOLLOW(A)=b\),则 \(M[A,b]\) 处填入此产生式
  3. 其余位置不填 \((ERROR)\)

\(\star\star LL(1)\) 文法

  • 第一个 \(L\) 表示:从左到右扫描输入串
  • 第二个 \(L\) 表示:最左推导
  • \(1\) 表示:分析时向后多查看一个符号

判断 \(LL(1)\) 文法:
第一种方法:

  1. 文法不含左递归
  2. 对于文法中每个产生式 \(A \rightarrow \alpha_{1}| \alpha_{2}|…|\alpha_{n}\) ,各候选式满足:
  • \(FIRST(\alpha_{i})\cap FIRST(\alpha_{j})= \emptyset (i \neq j)\) ,(两两不相交)
  • 若某个候选式包含 \(ε\),则 $FIRST(\alpha_{i}) \cap FOLLOW(A)=\emptyset $

第二种方法:
预测分析表中无重复

题型

1. 消除左递归
  • 方法:转换为右递归

\[\begin{align*} \ A \rightarrow A \alpha|\beta \Rightarrow \left\{ \begin{aligned} A &\rightarrow \beta A^{'}\\ A^{'} &\rightarrow \alpha A^{'}|ε \end{aligned} \right. \end{align*} \]

例题:
消除下列文法的二义性
1.

\[\begin{align*} S &\rightarrow (T) \qquad S \rightarrow a \qquad S \rightarrow ε\\ T &\rightarrow S \qquad T \rightarrow T,S \end{align*} \]

解:

\[T \rightarrow T,S|S \Rightarrow \left\{ \begin{aligned} T &\rightarrow S T^{'}\\ T^{'} &\rightarrow ~\ ,ST^{'}|ε \end{aligned} \right. \]

得到文法

\[\begin{align*} S &\rightarrow (T) \qquad S \rightarrow a \qquad S \rightarrow ε\\ T &\rightarrow S T^{'} \qquad T^{'} \rightarrow ~\ ,ST^{'}|ε \end{align*} \]

\[\begin{align*} G[S]: S &\rightarrow S(| Sa|aP|b \\ P &\rightarrow i \end{align*} \]

解:

\[\begin{align*} G[S]: S &\rightarrow aPS^{'}|bS^{'} \\ S^{'} &\rightarrow (S^{'}|aS^{'}|ε\\ P &\rightarrow i \end{align*} \]

\[\begin{align*} G: P &\rightarrow PaPb|BaP \end{align*} \]

解:

\[\begin{align*} G: P&\rightarrow BaPP^{'} \\ P^{'} &\rightarrow aPbP^{'}|ε \end{align*} \]

2. 消除回溯
  • 方法:提取公共左因子

\[\begin{align*} \ A \rightarrow \delta \beta_{1}|\delta \beta_{2} |…| \delta \beta_{n}|\gamma_{1}|…|\gamma_{m}\Rightarrow \left\{ \begin{aligned} A &\rightarrow \delta A^{'}|\gamma_{1}|…|\gamma_{m}\\ A^{'} &\rightarrow \beta_{1}| \beta_{2} |…| \beta_{n} \end{aligned} \right. \end{align*} \]

例题:
消除下列文法的回溯

\[\begin{align*} G[S]:S &\rightarrow ( P|(a|Pa|bc\\ P &\rightarrow i|ε \end{align*} \]

解:

\[\begin{align*} G[S]:S &\rightarrow (S^{'}|Pa|bc\\ S^{'} &\rightarrow P|a\\ P &\rightarrow i|ε \end{align*} \]

3. 构造 \(FIRST\) 集合和 \(FOLLOW\) 集合

求各非终结符的 \(FIRST\)\(FOLLOW\) 集合

  1. 文法 \(G[E]:\)

\[\begin{align*} E &\rightarrow TE^{'} \qquad E^{'} \rightarrow +TE^{'}| ε \qquad T \rightarrow FT^{'}\\ T^{'} &\rightarrow *FT^{'}|ε ~\ ~\ F \rightarrow (E)|i \end{align*} \]

解:

\[\begin{align*} FIRST(E) &=\{i,(\},FOLLOW(E)=\{ \#,)\} \\ FIRST(E^{'}) &=\{+,ε\},FOLLOW(E^{'})=\{\#,)\} \\ FIRST(T)&=\{i,(\},FOLLOW(T)=\{+,\#,)\} \\ FIRST(T^{'})&=\{*,ε\},FOLLOW(T^{'})=\{+,\#,)\} \\ FIRST(F)&=\{i,(\},FOLLOW(F)=\{*,+,\#,)\} \\ \end{align*} \]

  1. 文法 \(G[S]:\)

\[\begin{align*} S &\rightarrow aAB \qquad S \rightarrow bA \qquad S \rightarrow ε\\ A &\rightarrow aAb \qquad A \rightarrow ε \qquad B \rightarrow bB \qquad B \rightarrow ε \end{align*} \]

解:

\[\begin{align*} FIRST(S) &=\{a,b,ε\},FOLLOW(S)=\{ \#\} \\ FIRST(A) &=\{a,ε\},FOLLOW(A)=\{\#,b\} \\ FIRST(B)&=\{b,ε\},FOLLOW(B)=\{\#\} \\ \end{align*} \]

  1. 文法 \(G[E]:\)

\[\begin{align*} E &\rightarrow T(E^{'}) \qquad E^{'} \rightarrow +TE^{'}|ε \\ T &\rightarrow (E)|i \end{align*} \]

解:

\[\begin{align*} FIRST(E) &=\{(,i\},FOLLOW(E)=\{ \#,)\} \\ FIRST(E^{'}) &=\{+,ε\},FOLLOW(E^{'})=\{)\} \\ FIRST(T)&=\{(,i\},FOLLOW(T)=\{(,+,)\} \\ \end{align*} \]

4. 构造预测分析表

构造下列文法的预测分析表

  1. 文法 \(G[E]:\)

\[\begin{align*} E &\rightarrow TE^{'} \qquad E^{'} \rightarrow +TE^{'}| ε \qquad T \rightarrow FT^{'}\\ T^{'} &\rightarrow *FT^{'}|ε ~\ ~\ F \rightarrow (E)|i \end{align*} \]

解:

\[\begin{align*} FIRST(E) &=\{i,(\},FOLLOW(E)=\{ \#,)\} \\ FIRST(E^{'}) &=\{+,ε\},FOLLOW(E^{'})=\{\#,)\} \\ FIRST(T)&=\{i,(\},FOLLOW(T)=\{+,\#,)\} \\ FIRST(T^{'})&=\{*,ε\},FOLLOW(T^{'})=\{+,\#,)\} \\ FIRST(F)&=\{i,(\},FOLLOW(F)=\{*,+,\#,)\} \\ \end{align*} \]

预测分析表:

i + * ( ) #
E E → TE' E → TE'
E' E' → +TE' E →ε E →ε
T T → FT' T → FT'
T' T' →ε T' → *FT' T' →ε T' →ε
F F → i F→(E)
  1. 文法 \(G[S]:\)

\[\begin{align*} S &\rightarrow Sb \qquad S \rightarrow Ab \qquad S \rightarrow ε\\ A &\rightarrow Aa \qquad A \rightarrow a \end{align*} \]

(1)构造与 \(G\) 等价的 \(LL(1)\) 文法 \(G'\)
(2)对于 \(G'\) ,求非终结符的 \(FIRST\)\(FOLLOW\) 集合,并且构造预测分析表
解:
(1)

\[\begin{align*} S &\rightarrow bS'|AbS' \qquad S' \rightarrow bS'|ε\\ A &\rightarrow aA' \qquad \qquad A' \rightarrow aA'|ε \end{align*} \]

(2)

\[\begin{align*} FIRST(S) &=\{b,a\},FOLLOW(S)=\{ \#\} \\ FIRST(S') &=\{a,b,ε\},FOLLOW(S')=\{\#\} \\ FIRST(A)&=\{a\},FOLLOW(A)=\{b\} \\ FIRST(A')&=\{a,ε\},FOLLOW(A')=\{b\} \\ \end{align*} \]

预测分析表

a b #
S S → AbS' S → bS'
S' S' → bS' S' →ε
A A → aA'
A' A' →aA' A' →ε
  1. 文法 \(G[S]:\)

\[\begin{align*} S &\rightarrow aAc|bBa \qquad A \rightarrow b|ε \qquad B\rightarrow aBc|b \end{align*} \]

(1)计算每个非终结符的 \(FIRST\)\(FOLLOW\) 集合,
(2)判断该文法是否为 \(LL(1)\) 文法,若是,请构造预测分析表,否则请说明理由

(1)

\[\begin{align*} FIRST(S) &=\{a,b\},FOLLOW(S)=\{\#\} \\ FIRST(A) &=\{b,ε\},FOLLOW(A)=\{c\} \\ FIRST(B)&=\{a,b\},FOLLOW(B)=\{a,c\} \\ \end{align*} \]

(2)
① 无左递归
② $FIRST(aAc) \cap FIRST(bBa)=\emptyset $ ,$FIRST(aBc) \cap FIRST(b)=\emptyset $
\(FOLLOW(A) \cap FIRST(b)= \emptyset\)

所以该文法是 \(LL(1)\) 文法
预测分析表:

a b c #
S S → aAc S → bBa
A A →b A →ε
B B → aBc B → b
posted @ 2023-05-07 15:05  风雨zzm  阅读(148)  评论(1)    收藏  举报