编译原理练习
设文法为:
| $E’ \rightarrow $#$E$# | $T \rightarrow F$ |
|---|---|
| $E \rightarrow E+T$ | $F \rightarrow P \uparrow F \vert P $ |
| $E \rightarrow T$ | $P \rightarrow (E)$ |
| $T \rightarrow T*F$ | $P\rightarrow i$ |
求算符优先关系表,并分析$i+i$#是否为该文法的句子。
解:
$bool\space array$:
求$FIRSTVT$:
| + | * | $ \uparrow $ | $i$ | ( | ) | # | |
|---|---|---|---|---|---|---|---|
| $E’$ | 1 | ||||||
| $E$ | 1 | 1 | 1 | 1 | 1 | ||
| $T$ | 1 | 1 | 1 | 1 | |||
| $F$ | 1 | 1 | 1 | ||||
| $P$ | 1 | 1 |
求$LASTVT$:
| + | * | $\uparrow$ | $i$ | ( | ) | # | |
|---|---|---|---|---|---|---|---|
| $E’$ | 1 | ||||||
| $E$ | 1 | 1 | 1 | 1 | 1 | ||
| $T$ | 1 | 1 | 1 | 1 | |||
| $F$ | 1 | 1 | 1 | ||||
| $P$ | 1 | 1 |
$FIRSTVT$与$LASTVT$如表所示:
| $VN$ | $FIRSTVT$ | $LASTVT$ |
|---|---|---|
| $E$ | +,*,$\uparrow$,(,$i$ | +,*,$\uparrow$,),$i$ |
| $E’$ | # | # |
| $T$ | *,$\uparrow$,(,$i$ | *,$\uparrow$,),$i$ |
| $F$ | $\uparrow$,(,$i$ | $\uparrow$,),$i$ |
| $T$ | (,$i$ | ),$i$ |
| 步骤 | 栈 | 优先关系 | 当前符号 | 剩余输出串 | 移进或规约 |
|---|---|---|---|---|---|
| 1 | # | < | $i$ | +$i$# | 移进 |
| 2 | #$i$ | > | + | $i$# | 规约 |
| 3 | #$F$ | < | + | $i$# | 移进 |
| 4 | #$F+$ | < | $i$ | # | 移进 |
| 5 | #$F+i$ | > | # | 规约 | |
| 6 | #$F+F$ | > | # | 规约 | |
| 7 | #$F$ | = | # | Accepted |
综上,$i+i$# 是该文法的句子。