对文法“D->TL” “T->i” “T->f” “L->L,x” “L->x”构造LR项目集族
时间: 2024-05-31 13:13:40 浏览: 132
LR(0) 项目集族如下:
I0:
D -> .TL
T -> .i
T -> .f
L -> .L,x
L -> .x
I1:
D -> T.L (from I0, shift T)
T -> .i (from I0, shift i)
T -> .f (from I0, shift f)
L -> .L,x (from I0, shift L)
L -> .x (from I0, shift x)
I2:
D -> TL. (from I1, reduce L -> x)
L -> L.,x (from I1, shift x)
I3:
L -> L,x. (from I2, shift x)
I4:
D -> T.L (from I1, shift T)
T -> .i (from I1, shift i)
T -> .f (from I1, shift f)
L -> .L,x (from I1, shift L)
L -> .x (from I1, shift x)
L -> L.,x (from I2, shift x)
I5:
D -> TL. (from I4, reduce L -> L,x)
L -> L.,x (from I4, shift x)
注意,这里的“.”表示LR(0)项目中的“当前位置”,即还未处理的部分。例如,“D -> .TL”表示还未处理任何符号,而“D -> T.L”则表示已经处理完 T,但还未处理 L。
相关问题
对文法D->TL T->i T->f L->L,x L->x构造LR项目集族
首先,我们需要定义文法符号的编号,如下:
```
0: D'
1: D
2: T
3: L
4: i
5: f
6: ,
7: x
8: $
```
其中,`0` 表示起始符号,`8` 表示结束符号。
然后,我们可以按照以下步骤构造 LR 项目集族:
1. 初始化第 0 个项目集为 {`D' -> .D`}。
2. 对于每个项目集 `I` 和文法符号 `X`,进行如下操作:
a. 遍历 `I` 中的每个项目 `A -> α.Xβ`。
b. 对于 `X` 的每个产生式 `X -> γ`,构造新的项目 `X -> .γ` 并将其加入集合 `J` 中。
c. 对于 `J` 中的每个项目 `X -> .γ`,计算其闭包 `closure(X -> .γ)` 并将其加入集合 `I` 中。
d. 若集合 `I` 为新的项目集,则重复以上操作,直到不再出现新的项目集。
e. 记录 `I` 中 `X -> .γ` 对应的项目编号,并将其加入 LR 分析表的对应位置。
下面是构造过程的详细过程:
| I0: {D' -> .D} |
| --- |
1. 初始项目集为 `{D' -> .D}`。
| I0: {D' -> .D} |
| --- |
| D -> .TL |
2. 对于 `I0` 中的项目 `D -> .TL`,有两个产生式 `T -> i` 和 `T -> f`。因此,构造两个新的项目:
```
T -> .i
T -> .f
```
并将它们加入集合 `J0` 中:
```
J0: {T -> .i, T -> .f}
```
接下来,计算 `J0` 中每个项目的闭包:
```
closure(T -> .i): { T -> .i }
closure(T -> .f): { T -> .f }
```
并将它们加入项目集 `I0` 中:
```
I0: { D' -> .D, T -> .i, T -> .f }
```
最后,记录 `T -> .i` 和 `T -> .f` 对应的项目编号,并将其加入 LR 分析表的对应位置:
```
ACTION[0,i] = shift(1)
ACTION[0,f] = shift(2)
```
| I0: {D' -> .D, T -> .i, T -> .f} |
| --- |
| T -> .i |
| T -> .f |
3. 对于 `I0` 中的项目 `T -> .i`,没有新的产生式可以扩展,因此不需要进行操作。
4. 对于 `I0` 中的项目 `T -> .f`,有两个产生式 `L -> L,x` 和 `L -> x`。因此,构造两个新的项目:
```
L -> .L,x
L -> .x
```
并将它们加入集合 `J1` 中:
```
J1: {L -> .L,x, L -> .x}
```
接下来,计算 `J1` 中每个项目的闭包:
```
closure(L -> .L,x): { L -> .L,x, L -> .x }
closure(L -> .x): { L -> .x }
```
并将它们加入项目集 `I1` 中:
```
I1: { T -> .f, L -> .L,x, L -> .x }
```
最后,记录 `L -> .L,x` 和 `L -> .x` 对应的项目编号,并将其加入 LR 分析表的对应位置:
```
ACTION[1,x] = shift(3)
ACTION[1,$] = reduce(L -> x)
```
| I1: {T -> .f, L -> .L,x, L -> .x} |
| --- |
| L -> .L,x |
| L -> .x |
5. 对于 `I1` 中的项目 `L -> .L,x`,只有一个产生式 `L -> L,x` 可以扩展,因此构造新的项目:
```
L -> L.,x
```
并将其加入集合 `J2` 中:
```
J2: {L -> L.,x}
```
接下来,计算 `J2` 中的项目闭包:
```
closure(L -> L.,x): { L -> L.,x, L -> .L,x, L -> .x }
```
并将其加入项目集 `I2` 中:
```
I2: { L -> L.,x, L -> .L,x, L -> .x }
```
最后,记录 `L -> L.,x` 对应的项目编号,并将其加入 LR 分析表的对应位置:
```
ACTION[2,x] = shift(4)
```
| I2: {L -> L.,x, L -> .L,x, L -> .x} |
| --- |
| L -> L.,x |
| L -> .L,x |
| L -> .x |
6. 对于 `I2` 中的项目 `L -> .L,x`,只有一个产生式 `L -> L.,x` 可以扩展,因此构造新的项目:
```
L -> L.,x
```
并将其加入集合 `J3` 中:
```
J3: {L -> L.,x}
```
接下来,计算 `J3` 中的项目闭包:
```
closure(L -> L.,x): { L -> L.,x, L -> .L,x, L -> .x }
```
并将其加入项目集 `I3` 中:
```
I3: { L -> L.,x, L -> .L,x, L -> .x }
```
最后,记录 `L -> L.,x` 对应的项目编号,并将其加入 LR 分析表的对应位置:
```
ACTION[3,x] = reduce(L -> L)
ACTION[3,$] = reduce(T -> fTL)
```
最终得到的 LR 项目集族如下:
| I0: {D' -> .D, T -> .i, T -> .f} |
| --- |
| T -> .i |
| T -> .f |
| I1: {T -> .f, L -> .L,x, L -> .x} |
| --- |
| L -> .L,x |
| L -> .x |
| I2: {L -> L.,x, L -> .L,x, L -> .x} |
| --- |
| L -> L.,x |
| L -> .L,x |
| L -> .x |
| I3: {L -> L.,x, L -> .L,x, L -> .x} |
| --- |
| (reduce) L -> L |
| (reduce) T -> fTL |
LR 分析表如下:
| | i | f | , | x | $ |
| -- | -------- | -------- | -------- | -------- | -------- |
| 0 | shift(1) | shift(2) | | | |
| 1 | | | shift(3) | reduce | reduce |
| 2 | | | | shift(4) | reduce |
| 3 | | | | reduce | reduce |
| 4 | shift(1) | shift(2) | | | |
对文法D->TL T->i T->f L->L,x L->x构造LR项目集族,构造First和Follow集合
首先,我们需要构造该文法的LR(0)项目集族。LR(0)项目集族的构造过程如下:
1. 将初始项目 $[D'->·TL]$ 加入项目集族 $I_0$ 中。
2. 对于每个项目集 $I_i$,以及每个 $A\in VN$,进行如下操作:
a. 对于 $[B->\alpha·A\beta]$ 属于 $I_i$,将 $[B->\alpha A·\beta]$ 加入 $I_i$ 中。
b. 对于所有 $A\in VT$,不进行操作。
c. 对于所有 $[B->\alpha·A\beta]$,以及所有 $a\in First(\beta)$,将 $[B->\alpha A·\beta]$ 加入 $I_i$ 中。
3. 重复步骤 2,直到没有新的项目可以加入。
最终得到的 LR(0) 项目集族为:
$I_0$:
```
D' -> ·TL
```
$I_1$:
```
D' -> T·L
T -> ·i
T -> ·f
L -> ·L,x
L -> ·x
```
$I_2$:
```
T -> i·
```
$I_3$:
```
T -> f·
```
$I_4$:
```
L -> x·
```
$I_5$:
```
L -> L·,x
```
接下来,我们可以通过项目集族来构造该文法的 First 集合和 Follow 集合。
首先,构造 First 集合:
- 对于所有 $a\in VT$,$First(a)=\{a\}$。
- 对于所有 $A\in VN$:
- 如果存在产生式 $A\rightarrow\varepsilon$,则将 $\varepsilon$ 加入到 $First(A)$ 中。
- 如果存在产生式 $A\rightarrow B_1B_2...B_k$,则将 $First(B_1)$ 中的所有非 $\varepsilon$ 终结符加入到 $First(A)$ 中。
- 如果对于某个 $i\in[1,k]$,$B_1B_2...B_{i-1}$ 的所有符号都能推出 $\varepsilon$,则将 $First(B_i)$ 中的所有非 $\varepsilon$ 终结符加入到 $First(A)$ 中。
- 如果对于所有 $i\in[1,k]$,$B_1B_2...B_{i-1}$ 的所有符号都能推出 $\varepsilon$,则将 $\varepsilon$ 加入到 $First(A)$ 中。
因此,可以得到该文法的 First 集合为:
$First(i)=\{i\}$
$First(f)=\{f\}$
$First(x)=\{x\}$
$First(L)=\{x,\varepsilon\}$
$First(T)=\{i,f\}$
接下来,构造 Follow 集合:
- 将 $D'$ 的 Follow 集合初始化为 $\{\$\}$,其中 $\$$ 表示输入串的结束符。
- 对于所有 $A\in VN$:
- 对于所有 $A\rightarrow\alpha B\beta$ 的产生式,将 $First(\beta)-\{\varepsilon\}$ 加入到 $Follow(B)$ 中。
- 对于所有 $A\rightarrow\alpha B$ 或 $A\rightarrow\alpha B\beta$,如果 $\varepsilon\in First(\beta)$ 或 $\beta=\varepsilon$,则将 $Follow(A)$ 加入到 $Follow(B)$ 中。
因此,可以得到该文法的 Follow 集合为:
$Follow(D')=\{\$\}$
$Follow(T)=\{x,\$\}$
$Follow(L)=\{x,\$\}$
$Follow(x)=\{,\}$
阅读全文