针对文法:G[E]:E->E+T|T T->TF|F F->(E)|i 用c++编写程序利用LR(0)分析方法对该文法进行语法分析,构建i+ii句型分析过程中符号栈的变化过程并输出分析表
时间: 2024-05-28 19:11:35 浏览: 44
首先,我们需要构建该文法的 LR(0) 项集族和分析表。
1. 构建 LR(0) 项集族
初始化:
I0 = Closure({[E'->.E]})
求解 I0 的闭包,得到:
I0 = {[E'->.E], [E->.E+T], [E->.T], [T->.TF], [T->.F], [F->.(E)], [F->.i]}
然后,我们对每个项进行移进操作,得到新的项集:
I1 = Goto(I0, E) = {[E'->E.], [E->E.+T], [T->.TF], [T->.F], [F->.(E)], [F->.i]}
I2 = Goto(I0, T) = {[T->T.F.], [F->.(E)], [F->.i]}
I3 = Goto(I1, T) = {[E->E+.T], [T->.TF], [T->.F], [F->.(E)], [F->.i]}
I4 = Goto(I1, F) = {[T->TF.], [F->.(E)], [F->.i]}
I5 = Goto(I3, F) = {[E->E+T.], [F->.(E)], [F->.i]}
I6 = Goto(I4, E) = {[F->(E).]}
项集族构建完成。
2. 构建 LR(0) 分析表
对于每个项集 Ii 和每个终结符/非终结符 a,我们需要进行以下操作:
1. 如果存在某个项 [A->α.aβ] 属于 Ii,那么对应地将 action[i, a] 设为 “shift j”,其中 j 为 Goto(Ii, a) 所得到的项集。
2. 如果存在某个项 [A->α.] 属于 Ii 且 A != E',那么对于文法中的每个终结符 b,将 action[i, b] 设为 “reduce A->α”。
3. 如果项 [E'->E.] 属于 Ii,那么将 action[i, $] 设为 “accept”。
4. 如果出现冲突,那么就说明文法不是 LR(0) 文法。
根据上述规则,我们可以得到如下的 LR(0) 分析表:
| I | + | * | ( | ) | i | $ | E | T | F |
| --- | ----- | ----- | ----- | ----- | ----- | ----- | ----- | ----- | ----- |
| 0 | | | S1 | | S6 | | 2 | 3 | 4 |
| 1 | S5 | | | | | acc | | 8 | 9 |
| 2 | S5 | | | | | | | 7 | 9 |
| 3 | R2 | S5 | | R2 | | R2 | | | |
| 4 | R4 | R4 | | R4 | | R4 | | | |
| 5 | | | S1 | | S6 | | | | 10 |
| 6 | | | S1 | | S6 | | | | 11 |
| 7 | R6 | R6 | | R6 | | R6 | | | |
| 8 | R1 | S5 | | R1 | | R1 | | | |
| 9 | R3 | R3 | | R3 | | R3 | | | |
| 10 | R5 | R5 | | R5 | | R5 | | | |
| 11 | R7 | R7 | | R7 | | R7 | | | |
这张表中,S 表示 “shift”,R 表示 “reduce”,acc 表示 “accept”。
接下来,我们可以编写 C++ 代码进行语法分析。代码如下:
阅读全文