S->aSSb|aSSS|c构造LR(0)分析表
时间: 2023-12-27 18:01:54 浏览: 30
首先,我们需要求出该文法的所有 LR(0) 项集。
LR(0) 项集构造过程如下:
$I_0 = \texttt{Closure}(\{[S' \to \cdot S]\}) = \{[S' \to \cdot S]\}$
$I_1 = \texttt{Goto}(I_0, a) = \{[S' \to a \cdot SSb], [S \to a \cdot SSb], [S \to a \cdot SSS], [S \to \cdot aSSb], [S \to \cdot aSSS]\}$
$I_2 = \texttt{Goto}(I_1, S) = \{[S \to aS\cdot Sb], [S \to aS\cdot SS], [S \to a\cdot SSb], [S \to a\cdot SSS], [S \to \cdot aSSb], [S \to \cdot aSSS]\}$
$I_3 = \texttt{Goto}(I_1, c) = \{[S \to \cdot c]\}$
然后,我们可以通过以下步骤构造 LR(0) 分析表:
1. 对于每个项集 $I_i$ 中的每个项 $[A \to \alpha \cdot \beta]$:
* 如果 $A \neq S'$ 且 $[A \to \alpha \cdot \beta]$ 是规约项,则对于所有 $a \in \text{Follow}(A)$,将 $[A \to \alpha \cdot \beta]$ 加入 $ACTION[i,a]$ 的规约项中。
* 如果 $A = S'$ 且 $[S' \to S \cdot]$ 是规约项,则对于所有 $a \in \{\$\}$,将 $[S' \to S \cdot]$ 加入 $ACTION[i,a]$ 的规约项中。
* 如果 $a \in \text{First}(\beta)$,则将 $[A \to \alpha \cdot \beta]$ 加入 $ACTION[i,a]$ 的移进项中。
2. 对于每个项集 $I_i$ 中的每个项 $[A \to \alpha \cdot B \beta]$:
* 如果 $B \neq \epsilon$,则将 $I_j$ 加入 $GOTO[i,B]$ 中,其中 $j$ 是满足 $\texttt{Goto}(I_i,B) = I_j$ 的项集的编号。
因此,我们可以得到如下的 LR(0) 分析表:
| | a | b | c | \$ | S |
|:-:|:----------:|:----------:|:-----:|:---------:|:---------:|
| 0 | S2 | | | | S1 |
| 1 | R3/R4/R5 | S6 | R3/R4 | R3/R4/R5 | |
| 2 | S2 | S7/R3/R4/R5| | R3/R4/R5 | S8 |
| 3 | | | S9 | Accept | |
| 6 | S2 | | | | S10 |
| 7 | R3/R4/R5 | S6 | R3/R4 | R3/R4/R5 | |
| 8 | R1/R2/R3/R4| S6 | R1/R2 | R1/R2/R3/R4| |
| 9 | | | | R1/R2/R3/R4| |
|10 | R2/R3/R4/R5| S6 | R2/R3 | R2/R3/R4/R5| |
其中,S 表示移进操作,R 表示规约操作(Ri 表示使用产生式 $i$ 进行规约),Accept 表示接受输入。例如,ACTION[0,a] 的值为 S2,表示在状态 0 输入 a 时应该将其移进状态 2。而 GOTO[2,S] 的值为 8,表示在状态 2 输入 S 时应该转移到状态 8。