对文法D->TL T->i T->f L->L,x L->x构造LR项目集族,构造First和Follow集合
时间: 2024-05-14 12:18:31 浏览: 77
编译作业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)=\{,\}$
阅读全文