已知文法G[E]:
E → E + T | T
T → (E) | id | id[E]
设计LR分析表,使用用C++编写语法分析器。
需要构造LR分析表,因此首先写出DFA:
根据DFA,可以看出如果使用LR(0),会产生冲突
,使用SLR(1).
构造SLR(1)分析表:
- 增广文法
0:S → E
1:E → E + T
2:E → T
3:T → (E)
4:T → id
5:T → id[E]
-
DFA
图画得好丑,将就看一下
由图所知,使用LR(0)将会有冲突,求出冲突的FOLLOW集,没有交集,所以可以使用SLR(0)。 -
SLR(1)分析表
0
:表示error,使用16
代表acc
状态 | id | + | ( | ) | [ | ] | # | T | E |
---|---|---|---|---|---|---|---|---|---|
0 | S4 | 0 | S3 | 0 | 0 | 0 | 0 | 2 | 1 |
1 | 0 | S5 | 0 | 0 | 0 | 0 | acc | 0 | 0 |
2 | 0 | R2 | 0 | R2 | 0 | R2 | R2 | 0 | 0 |
3 | S4 | 0 | S3 | 0 | 0 | 0 | 0 | 2 | 6 |
4 | 0 | R4 | 0 | R4 | S7 | R4 | R4 | 0 | 0 |
5 | S4 | 0 | S3 | 0 | 0 | 0 | 0 | 8 | 0 |
6 | 0 | S5 | 0 | S9 | 0 | 0 | 0 | 0 | 0 |
7 | S4 | 0 | S3 | 0 | 0 | 0 | 0 | 2 | 10 |
8 | 0 | R1 | 0 | R1 | 0 | R1 | R1 | 0 | 0 |
9 | S8 | R3 | 0 | R3 | 0 | R3 | R3 | 0 | 0 |
10 | 0 | S5 | 0 | 0 | 0 | S11 | 0 | 0 | 0 |
11 | 0 | R5 | 0 | R5 | 0 | R5 | R5 | 0 | 0 |
- 源代码
#include<iostream>
#include<cstring>
#include<stack>
#include<regex>
using namespace std;
string terminal="@+()[]#";
string nonterminal="TE";
int action[12][7]={
//负数表示规约,正数表示移入,0表示error,16代表acc
4,0,3,0,0,0,0,
0,5,0,0,0,0,16,
0,-2,0,-2,0,-2,-2,
4,0,3,0,0,0,0,
0,-4,0,-4,7,-4,-4,
4,0,3,