我是靠谱客的博主 称心大白,最近开发中收集的这篇文章主要介绍CSUFT 编译原理实验四 LR(1),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述


1 #include <cstdio>

2 #include <cstring>

3 #include <iostream>

4 #include <stack>

5 #include <queue>

6 #include <map>

7 #include <algorithm>

8 #include <vector>

9
 10 using namespace std;
 11
 12 char action[10][3][5]= {{"S3#","S4#","NUll"},
 13
{"NUll","NUll","acc"},
 14
{"S6#","S7#","NUll"},
 15
{"S3#","S4#","NUll"},
 16
{"r3#","r3#","NUll"},
 17
{"NUll","NUll","r1#"},
 18
{"S6#","S7#","NUll"},
 19
{"NUll","NUll","r3#"},
 20
{"r2#","r2#","NUll"},
 21
{"NUll","NUll","r2#"}
 22 
};
 23 /* GOTO表*/
 24 int goto1[10][2]= {1,2,
 25
0,0,
 26
0,5,
 27
0,8,
 28
0,0,
 29
0,0,
 30
0,9,
 31
0,0,
 32
0,0,
 33
0,0
 34 
};
 35 char vt[3]= {'a','b','#'}; /*存放终结符*/
 36 char vn[2]= {'S','B'};
/*存放非终结符*/
 37 char *LR[5]= {"E->S#","S->BB#","B->aB#","B->b#"}; /*存放产生式*/
 38 /*输出状态栈、输出符号栈、输出输入串*/
 39
 40 int main()
 41 {
 42
// printf("%snn" ,action[0][1]);
 43
int y,z,m,n,top,top1,top2,top3,j,k,i,g,h,l,p;
 44
char x;
 45
char b[10];//符号栈
 46
char str[10];//输入串
 47
int a[10];//状态栈
 48
char copy1[20],copy[20];
 49
int count = 0;
 50
top = top1 = top2 = top3 = 0;
 51
memset(a,0,sizeof(a));
 52
a[top1]=0;
 53
 54
b[top2] = '#';
 55
 56
scanf("%s",str);
 57
z=0;
 58
top3 =
strlen(str);
 59
int flag = 0;
 60
do
 61 
{
 62
y=z;
 63
//if() break;
 64
m=0;
 65
n=0;
/*y,z指向状态栈栈顶*/
 66
g=top;
 67
j=0;
 68
k=0;
 69
x=str[top];
 70
count++;
 71
printf("%dt",count);
 72
while(m<=top1)
/*输出状态栈*/
 73 
{
 74
printf("%d",a[m]);
 75
m=m+1;
 76 
}
 77
printf("tt");
 78
while(n<=top2)
/*输出符号栈*/
 79 
{
 80
printf("%c",b[n]);
 81
n=n+1;
 82 
}
 83
printf("tt");
 84
while(g<top3)
/*输出输入串*/
 85 
{
 86
printf("%c",str[g]);
 87
g=g+1;
 88 
}
 89
printf("tt");
 90
 91
 92
 93
/*查动作表*/
 94
if(x == 'a')j=0;
 95
if(x == 'b')j=1;
 96
if(x == '#')j=2;
 97
if(action[y][j]=="NUll"){
 98
printf("errorn");
 99
return 0;
100 
}
101
102 
strcpy(copy,action[y][j]);
103
104
/*处理移进*/
105
if(copy[0]=='S')
106 
{
107
z=copy[1]-'0';
108
top1=top1+1;
109
top2=top2+1;
110
a[top1]=z;
111
b[top2]=x;
112
top=top+1;
113
i=0;
114
while(copy[i]!='#')
115 
{
116
printf("%c",copy[i]);
117
i++;
118 
}
119
printf("n");
120 
}
121
122
/*处理归约*/
123
if(copy[0]=='r')
124 
{
125
i=0;
126
while(copy[i]!='#')
127 
{
128
printf("%c",copy[i]);
129
i++;
130 
}
131
h=copy[1]-'0';
132 
strcpy(copy1,LR[h]);
133
if(copy1[0]=='S')k=0;
134
if(copy1[0]=='B')k=1;
135
l=strlen(LR[h])-4;
136
top1=top1-l+1;
137
top2=top2-l+1;
138
y=a[top1-1];
139
p=goto1[y][k];
140
a[top1]=p;
141
b[top2]=copy1[0];
142
z=p;
143
printf("tt");
144
printf("%dn",p);
145 
}
146
if(copy[0]=='a') { printf("%sn",copy); flag =1;}
147
148
if(copy[0]=='N') {printf("errorn");flag = 1;}
149
if(flag) break;
150
}while(1);
151
return 0;
152 }
View Code

 

 

转载于:https://www.cnblogs.com/lmlyzxiao/p/5626681.html

最后

以上就是称心大白为你收集整理的CSUFT 编译原理实验四 LR(1)的全部内容,希望文章能够帮你解决CSUFT 编译原理实验四 LR(1)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(62)

评论列表共有 0 条评论

立即
投稿
返回
顶部