四、自上而下的语法分析
### 语法分析
- 语法分析是编译过程的核心部分。它的任务是在词法分析识别出单词符号串的基础上,分析并判定程序的语法结构是否符合语法规则。
- 按照语法分析树建立的方法,把语法分析分为两大类:
- 自上而下的语法分析
- 自下而上的语法分析
自上而下的语法分析
\(\star\)自上而下分析面临的问题
1. 文法左递归问题 \(\rightarrow\) 解决方法:转换为右递归
2. 回溯问题 \(\rightarrow\) 解决方法:提取公共左因子
\(\star\star\) 终结首符集 $ FIRST$ 集合
对于 \(A \rightarrow \alpha\)
- $ \alpha$ 为终结符,\(FIRST(\alpha)=\{\alpha \}\)
- $ \alpha$ 为非终结符,
- 若 $\alpha \rightarrow a\beta $,则 \(FIRST(\alpha)=\{a\}\)
- 若 $\alpha \rightarrow ε $,则 \(FIRST(\alpha)=\{ε\}\)
- $ \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$ 集合
- 对于文法开始符号 \(S\) ,\(\# \in FOLLOW(S)\)
- 若 \(B \rightarrow \alpha A \beta\) ,则 \(FIRST(\beta)-ε \in FOLLOW(A)\)
- 若 $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} $
- 求 \(FIRST(\alpha_{i})=a\),则 \(M[A,a]\) 处填入此产生式
- 若 \(FIRST(\alpha_{i})=ε\),则求 \(FOLLOW(A)=b\),则 \(M[A,b]\) 处填入此产生式
- 其余位置不填 \((ERROR)\)
\(\star\star LL(1)\) 文法
- 第一个 \(L\) 表示:从左到右扫描输入串
- 第二个 \(L\) 表示:最左推导
- \(1\) 表示:分析时向后多查看一个符号
判断 \(LL(1)\) 文法:
第一种方法:
- 文法不含左递归
- 对于文法中每个产生式 \(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\) 集合
- 文法 \(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*}
\]
- 文法 \(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*}
\]
- 文法 \(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. 构造预测分析表
构造下列文法的预测分析表
- 文法 \(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) |
- 文法 \(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' →ε |
- 文法 \(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 |
本文来自博客园,作者:风雨zzm,转载请注明原文链接:https://www.cnblogs.com/zzmxj/p/17373425.html