E->E+T|T T->TF|F F->F*|(E)|a|b|e 构造LALR分析表
时间: 2023-08-21 13:15:17 浏览: 112
为了构造LALR分析表,需要先构造LR(0)自动机。下面是该自动机的状态转换图:
```
状态0:
E -> .E+T
E -> .T
T -> .TF
T -> .F
F -> .F*
F -> .(E)
F -> .a
F -> .b
F -> .e
E -> E.+T
E -> E+.T
状态1:
E -> T.
T -> T.F
F -> .F*
F -> .(E)
F -> .a
F -> .b
F -> .e
状态2:
E -> E+.T
T -> T.F.
F -> F*.
状态3:
E -> E+T.
T -> T.F
F -> .F*
F -> .(E)
F -> .a
F -> .b
F -> .e
状态4:
T -> T.F.
F -> F*.
状态5:
F -> (E).
E -> .E+T
E -> .T
T -> .TF
T -> .F
F -> .F*
F -> .(E)
F -> .a
F -> .b
F -> .e
E -> E.+T
E -> E+.T
状态6:
F -> a.
T -> .TF
T -> .F
F -> .F*
F -> .(E)
F -> .a
F -> .b
F -> .e
E -> E.+T
E -> E+.T
状态7:
F -> b.
T -> .TF
T -> .F
F -> .F*
F -> .(E)
F -> .a
F -> .b
F -> .e
E -> E.+T
E -> E+.T
状态8:
F -> e.
T -> .TF
T -> .F
F -> .F*
F -> .(E)
F -> .a
F -> .b
F -> .e
E -> E.+T
E -> E+.T
```
然后,我们需要为每个状态构造对应的LALR(1)项集。这里只给出状态0的LALR(1)项集:
```
{
E -> .E+T, { $, + }
E -> .T, { $, + }
T -> .TF, { $, +, * }
T -> .F, { $, +, * }
F -> .F*, { $, +, *, a, b, ), e }
F -> .(E), { $, +, *, a, b, ), e }
F -> .a, { $, +, *, a, b, ), e }
F -> .b, { $, +, *, a, b, ), e }
F -> .e, { $, +, *, a, b, ), e }
}
```
最后,我们可以根据LALR(1)项集构造出LALR分析表。下面是完整的LALR分析表:
```
| $ | + | * | ( | ) | a | b | e |
-----+-------+-------+-------+-------+-------+-------+-------+-------+
0 | | s5 | | s4 | | s6 | s7 | s8 |
1 | acc | | | | | | | |
2 | r2 | r2 | s3 | r2 | r2 | r2 | r2 | r2 |
3 | r4 | s5 | r4 | r4 | r4 | r4 | r4 | r4 |
4 | r6 | | r6 | r6 | r6 | r6 | r6 | r6 |
5 | | s5 | | s4 | | s6 | s7 | s8 |
6 | r8 | | r8 | r8 | r8 | r8 | r8 | r8 |
7 | r9 | | r9 | r9 | r9 | r9 | r9 | r9 |
8 | r10 | | r10 | r10 | r10 | r10 | r10 | r10 |
```
其中,s表示移进,r表示归约,acc表示接受。例如,表中第一行第二列的s5表示在状态0读入+时应该将其移进状态5。