预测分析法编译原理文档格式.doc
《预测分析法编译原理文档格式.doc》由会员分享,可在线阅读,更多相关《预测分析法编译原理文档格式.doc(5页珍藏版)》请在冰豆网上搜索。
Step
Stack
String
Rule
1
#S
m+m*m#
AT
10
#TUm
m*m#
M匹配
2
#TA
A->
BU
11
#TU
*m#
U->
*BU
3
#TUB
B->
m
12
#TUB*
*匹配
4
13
m#
5
+m*m#
$
14
6
#T
T->
+AT
15
#
7
#TA+
+匹配
16
8
17
接受
9
五、提示
本实验重点有两个:
一是如何用适当的数据结构实现预测分析表存储和使用;
二是如何实现各规则右部串的逆序入栈处理。
建议:
使用结构体数组。
六、分析与讨论
1、若输入串不是指定文法的句子,会出现什么情况?
2、总结预测语法分析程序的设计和实现的一般方法。
代码:
#include<
stdio.h>
stdlib.h>
string.h>
windows.h>
structstack1
{
charstack[10];
}sta[][7]=
"
\0"
"
+"
*"
("
)"
m"
#"
S"
AT"
A"
BU"
T"
+AT"
$"
B"
(S)"
U"
*BU"
};
//structstack*head;
charstack_1[10]={'
\0'
},stack_2[10]={'
},stack_3[10]={'
inti,j,k,len_1,len_2,len_3,mark=0;
voidmain()
//voidc_stack();
voidanalyze_stack();
voidsurplus_str();
intrules();
//printf("
%s\t"
sta[0][1].stack);
//printf("
\n"
);
while
(1)
{
// system("
cls"
mark=0;
printf("
请输入串:
gets(stack_3);
if(stack_3[0]=='
0'
)
break;
stack_1[0]='
S'
;
len_3=strlen(stack_3);
if(stack_3[len_3-1]!
='
#'
printf("
字符串输入错误,字符串不以#号结束!
continue;
}
分析栈\t\t剩余串\t\t\t\t\t\t规则\n"
for(i=0;
i<
=100;
i++)
analyze_stack();
surplus_str();
rules();
if(mark==1)
break;
if(stack_1[0]=='
&
stack_3[0]=='
{
printf("
#\t\t#\t\t\t\t\t\t成功接受\n"
break;
}
}
voidanalyze_stack()//分析栈
#%-15s"
stack_1);
len_1=strlen(stack_1);
voidsurplus_str()//剩余串//注意拼写的正确性,写成surlpus_str()报错,unresolvedsxternalsymbol_surplus_str;
%-48s"
stack_3);
intrules()//所用规则
intp,q,h;
chartemp;
//printf("
%d"
len_1);
if(stack_1[len_1-1]==stack_3[0])
printf("
%c匹配\n"
stack_3[0]);
stack_1[len_1-1]='
for(h=1;
h<
=len_3-1;
h++)
stack_3[h-1]=stack_3[h];
stack_3[len_3-1]='
elseif(stack_1[len_1-1]<
'
A'
||stack_1[len_1-1]>
Z'
报错\n"
mark=1;
return0;
elseif(stack_1[len_1-1]>
stack_1[len_1-1]<
for(j=1;
j<
=5;
j++)
if(stack_1[len_1-1]==sta[j][0].stack[0])
{
p=j;
break;
}
if(j>
=6)
mark=1;
return0;
for(k=1;
k<
=6;
k++)
if(stack_3[0]==sta[0][k].stack[0])
q=k;
if(k>
=7)
if(sta[p][q].stack[0]=='
printf("
mark=1;
return0;
strcpy(stack_2,sta[p][q].stack);
len_2=strlen(stack_2);
%c->
%s\n"
stack_1[len_1-1],stack_2);
if(stack_2[0]=='
$'
else
for(h=0;
len_2/2;
temp=stack_2[h];
stack_2[h]=stack_2[len_2-1-h];
stack_2[len_2-1-h]=temp;
strcat(stack_1,stack_2);
return0;