编译原理作业四

1、已知文法

\[ A \rightarrow aAd | aAb | \varepsilon \]

判断该文法是否是 \(SLR(1)\) 文法,若是,请构造相应分析表,并对输入串 \(ab\#\) 给出分析过程。

解:

文法 \(A \rightarrow aAd | aAb | \varepsilon\) 的增广文法为 \(G^{'}\),增加产生式 \(S^{'} \rightarrow A\),若产生式排序为:

\[ \begin{split} 0 \quad &S^{'} \rightarrow A \\ 1 \quad &A \rightarrow aAd \\ 2 \quad &A \rightarrow aAb \\ 3 \quad &A \rightarrow \varepsilon \end{split} \]

由产生式知:

\[ \begin{split} &FIRST(S^{'}) = \{\varepsilon, a\} \\ &FIRST(A) = \{\varepsilon, a\} \\ &FOLLOW(S^{'}) = \{\#\} \\ &FOLLOW(A) = \{d, b, \#\} \\ \end{split} \]

\(G^{'}\)\(LR(0)\) 项目集族及识别活前缀的 \(\text{DFA}\) 如下图所示:

由图可知,此状态机存在移进-归约冲突,故不是 \(LR(0)\) 文法。

\(I_0\)\(I_2\) 中,

\[ FOLLOW(A) \cap \{a\} = \{d, b, \#\} \cap \{a\} = \varnothing \]

所以在 \(I_0\)\(I_2\) 中的移进-归约冲突可以由 \(FOLLOW\) 集解决,所以 \(G\)\(SLR(1)\) 文法。

构造 \(SLR(1)\) 分析表如下:

对输入串 \(ab\#\) 的分析过程如下

分析成功,说明输入串 \(ab\) 是文法的句子。

3、考虑文法

\[ \begin{split} S \rightarrow AS | b \\ A \rightarrow SA | a \end{split} \]

(1) 列出这个文法的所有 \(\text{LR}(0)\) 项目。
(2) 按 (1) 列出的项目构造识别这个文法活前缀的 \(\text{NFA}\),把这个 \(\text{NFA}\) 确定化为 \(\text{DFA}\),说明这个 \(\text{DFA}\) 的所有状态全体构成这个文法的 \(\text{LR}(0)\) 规范族。
(3) 这个文法是 \(\text{SLR}(1)\) 的吗?若是,构造出它的 \(\text{SLR}\) 分析表。
(4) 这个文法是 \(\text{LALR}(1)\)\(\text{LR}(1)\) 的吗?

解:

(1) 令增广文法 \(G^{'}\)

\[ \begin{split} 0 \quad &S^{'} \rightarrow S \\ 1 \quad &S \rightarrow AS \\ 2 \quad &S \rightarrow b \\ 3 \quad &A \rightarrow SA \\ 4 \quad &A \rightarrow a \end{split} \]

文法所有的 \(\text{LR}(0)\) 项目如下:

(2) (1) 中构造的增广文法,其 \(\text{LR}(0)\) 项目集规范族及其文法识别活前缀的 \(\text{DFA}\) 如下:

(3) 不是。


编译原理作业四
http://fanyfull.github.io/2021/10/31/编译原理作业四/
作者
Fany Full
发布于
2021年10月31日
许可协议