1 # include <stdio.h>
2 # include <string.h>
3
4 //存储LR(0)分析表
5 struct node
6 {
7 char ch;
8 int num;
9 };
10 struct node table[]={
11
12 {'s',5},{'t',0},{'t',0},{'s',4},{'t',0},{'t',0},{'t',1},{'t',2},{'t',3},
13 {'t',0},{'s',6},{'t',0},{'t',0},{'t',0},{'a',0},{'t',0},{'t',0},{'t',0},
14 {'t',0},{'r',2},{'s',7},{'t',0},{'r',2},{'r',2},{'t',0},{'t',0},{'t',0},
15 {'t',0},{'r',4},{'r',4},{'t',0},{'r',4},{'r',4},{'t',0},{'t',0},{'t',0},
16 {'s',5},{'t',0},{'t',0},{'s',4},{'t',0},{'t',0},{'t',8},{'t',2},{'t',3},
17 {'t',0},{'r',6},{'r',6},{'t',0},{'r',6},{'r',6},{'t',0},{'t',0},{'t',0},
18 {'s',5},{'t',0},{'t',0},{'s',4},{'t',0},{'t',0},{'t',0},{'t',9},{'t',3},
19 {'s',5},{'t',0},{'t',0},{'s',4},{'t',0},{'t',0},{'t',0},{'t',0},{'t',10},
20 {'t',0},{'s',6},{'t',0},{'t',0},{'s',11},{'t',0},{'t',0},{'t',0},{'t',0},
21 {'t',0},{'r',1},{'s',7},{'t',0},{'r',1},{'r',1},{'t',0},{'t',0},{'t',0},
22 {'t',0},{'r',3},{'r',3},{'t',0},{'r',3},{'r',3},{'t',0},{'t',0},{'t',0},
23 {'t',0},{'r',5},{'r',5},{'t',0},{'r',5},{'r',5},{'t',0},{'t',0},{'t',0},
24 };
25
26 //符号栈以及状态栈
27 struct node1
28 {
29 int pop;
30 int data[10];
31 char str[10];
32 }q1;
33
34 int total=0; //步骤
35 int i; //输入串下标
36 int function(int a,char c,int temp);
37
38
39 int main()
40 {
41
42 char ch[20];//存储输入串
43
44 //栈初始化
45 q1.data[0]=0;
46 q1.pop=1;
47 q1.str[0]='#';
48
49 i=0;
50 int temp; //下标转换
51 int aaa; //函数返回值,0代表输入串成功分析,1代表出错或者接受
52
53 gets(ch); //输入串;
54
55 // 输出表头和初始化的状态
56 printf("步骤\t状态栈\t符号栈\t输入串\t动作\n");
57 printf("%d\t%d\t#\t%s\t",++total,q1.data[0],ch);
58
59
60 //循环输出中间过程
61 while(1)
62 {
63 temp=0;
64 //面临不同的输入串采取不同的动作,由函数function实现
65 if(ch[i] == 'i')
66 {
67 temp=q1.data[q1.pop-1]*9+0;
68 aaa=function(0,'i',temp);
69
70 }
71 else if(ch[i] == '+')
72 {
73 temp=q1.data[q1.pop-1]*9+1;
74 aaa=function(1,'+',temp);
75
76 }
77 else if(ch[i] == '*')
78 {
79 temp=q1.data[q1.pop-1]*9+2;
80 aaa=function(2,'*',temp);
81
82 }
83 else if(ch[i] == '(')
84 {
85 temp=q1.data[q1.pop-1]*9+3;
86 aaa=function(3,'(',temp);
87
88 }
89 else if(ch[i] == ')')
90 {
91 temp=q1.data[q1.pop-1]*9+4;
92 aaa=function(4,')',temp);
93
94 }
95 else if(ch[i] == '#')
96 {
97 temp=q1.data[q1.pop-1]*9+5;
98 aaa=function(5,'#',temp);
99
100 }
101 if(aaa==0)
102 break;
103
104 //输出
105 printf("%c%d",table[temp].ch,table[temp].num);
106 printf("\n");
107 q1.str[q1.pop]='\0';
108 printf("%d\t",++total);
109 for(int k=0;k<q1.pop;k++)
110 {
111 printf("%d",q1.data[k]);
112 }
113 printf("\t");
114 printf("%s\t",q1.str);
115 for(k=i;k<strlen(ch);k++)
116 printf("%c",ch[k]);
117 printf("\t");
118 }
119 return 0;
120 }
121
122
123 int function(int a,char c,int temp)
124 {
125
126 temp=q1.data[q1.pop-1]*9+a;
127 if(table[temp].ch=='s')
128 {
129 q1.data[q1.pop]=table[temp].num;
130 q1.str[q1.pop++]=c;
131 i++;
132 }
133 if(table[temp].ch=='r')
134 {
135 if(table[temp].num == 1)
136 {
137 int leag,flag;
138 q1.pop=q1.pop-3;
139 q1.str[q1.pop]='E';
140 leag=q1.data[q1.pop-1]*9+6;
141 q1.data[q1.pop]=table[leag].num;
142 q1.pop++;
143 }
144 else if(table[temp].num == 2)
145 {
146 int leag,flag;
147 q1.pop=q1.pop-1;
148 q1.str[q1.pop]='E';
149 leag=q1.data[q1.pop-1]*9+6;
150 q1.data[q1.pop]=table[leag].num;
151 q1.pop++;
152 }
153 else if(table[temp].num == 3)
154 {
155 int leag,flag;
156 q1.pop=q1.pop-3;
157 q1.str[q1.pop]='T';
158 leag=q1.data[q1.pop-1]*9+7;
159 q1.data[q1.pop]=table[leag].num;
160 q1.pop++;
161 }
162 else if(table[temp].num == 4)
163 {
164 int leag,flag;
165 q1.pop=q1.pop-1;
166 q1.str[q1.pop]='T';
167 leag=q1.data[q1.pop-1]*9+7;
168 q1.data[q1.pop]=table[leag].num;
169 q1.pop++;
170 }
171 else if(table[temp].num == 5)
172 {
173 int leag,flag;
174 q1.pop=q1.pop-3;
175 q1.str[q1.pop]='F';
176 leag=q1.data[q1.pop-1]*9+8;
177 q1.data[q1.pop]=table[leag].num;
178 q1.pop++;
179 }
180 else if(table[temp].num == 6)
181 {
182 int leag,flag;
183 q1.pop=q1.pop-1;
184 q1.str[q1.pop]='F';
185 leag=q1.data[q1.pop-1]*9+8;
186 q1.data[q1.pop]=table[leag].num;
187 q1.pop++;
188 }
189 else
190 {
191 printf("出错\n");
192 return 0;
193 }
194 }
195 if(table[temp].ch=='a')
196 {
197 printf("接受!\n");
198 return 0;
199 }
200 return 1;
201 }