编译原理实验报告范文实验二语法分析算符优先2Word下载.docx
《编译原理实验报告范文实验二语法分析算符优先2Word下载.docx》由会员分享,可在线阅读,更多相关《编译原理实验报告范文实验二语法分析算符优先2Word下载.docx(6页珍藏版)》请在冰豆网上搜索。
//存放剩余串charAnalyeStack[SIZE];
//分析栈voidanalye();
inttetchar(char某);
//判断字符某在算符优先关系表中的位置
voidremainString();
//移进时处理剩余字符串,即去掉剩余字符串第一个字符intk;
voidinit()//构造算符优先关系表,并将其存入数组中{
priority[0][0]='
>
'
;
priority[0][1]='
priority[0][5]='
priority[1][0]='
priority[1][1]='
priority[1][2]='
priority[1][5]='
priority[2][0]='
priority[2][1]='
priority[2][2]='
$'
//无优先关系的用$表示priority[2][3]='
priority[2][4]='
priority[2][5]='
priority[3][0]='
priority[4][0]='
priority[4][1]='
priority[4][2]='
priority[4][3]='
priority[4][4]='
priority[4][5]='
priority[5][0]='
}
priority[5][2]='
voidanalye()//对所输入的句子进行算符优先分析过程的函数{
if(AnalyeStack[k]=='
+'
||AnalyeStack[k]=='
某'
i'
||AnalyFILE某fp;
fp=fopen(\
inti,j,f,z,z1,n,n1,z2,n2;
intcount=0;
//操作的步骤数chara;
//用于存放正在分析的字符charp,Q,p1,p2;
f=trlen(input);
//测出数组的长度for(i=0;
i<
=f;
i++){
a=input[i];
if(i==0)
remainString();
eStack[k]=='
('
)'
#'
)
j=k;
ele
j=k-1;
z=tetchar(AnalyeStack[j]);
//从优先关系表中查出[j]和a的优先关系if(a=='
||a=='
n=tetchar(a);
ele//如果句子含有不是终结符集合里的其它字符,不合法{}
p=priority[z][n];
printf(\错误!
该句子不是该文法的合法句子!
\\n\break;
if(p=='
){}
\\n\return;
{for(;
{
Q=AnalyeStack[j];
if(AnalyeStack[j-1]=='
||AnalyeStack[j-1]=='
j=j-1;
j=j-2;
z1=tetchar(AnalyeStack[j]);
n1=tetchar(Q);
p1=priority[z1][n1];
if(p1=='
count++;
printf(\%\\tc\\t\\\t归约
\\n\
fprintf(fp,\归约\
k=j+1;
i--;
AnalyeStack[k]='
N'
intr,r1;
r=trlen(AnalyeStack);
for(r1=k+1;
r1
AnalyeStack[r1]='
\\0'
break;
}elecontinue;
ele{
printf(\%\\tc\\t\\\t移进
fprintf(fp,\移进\
}ele{
='
){
z2=tetchar(AnalyeStack[j]);
n2=tetchar('
);
p2=priority[z2][n2];
if(p2=='
printf(\%\\tc\\t\\\t接受
k=k+1;
AnalyeStack[k]=a;
fprintf(fp,\接受\
printf(\该句子是该文法的合法句子。
fprintf(fp,\该句子是该文法的合法句子。
\\n\}
inttetchar(char某){
intm;
if(某=='
m=0;
fprintf(fp,\移进\}
fcloe(fp);
}ele{}
fprintf(fp,\错误!
该句子不是该文法的合法句子。
m=1;
m=2;
m=3;
m=4;
m=5;
returnm;
voidremainString(){}
voidmain(){
FILE某fp;
fprintf(fp,\要分析的文法为:
\\n\fprintf(fp,\fprintf(fp,\fprintf(fp,\fprintf(fp,\fprintf(fp,\fprintf(fp,\fprintf(fp,\fprintf(fp,\优先关系表为:
\\n\intm,n;
char1[6]={'
'
};
init();
printf(\文法为:
\\n\printf(\printf(\printf(\printf(\printf(\printf(\printf(\inti,j;
i=trlen(remain);
for(j=0;
j
remain[j]=remain[j+1];
remain[i-1]='
fprintf(fp,\for(m=0;
m<
6;
m++){fprintf(fp,\for(n=0;
n<
n++){
fprintf(fp,\}
fprintf(fp,\
printf(\
printf(\算符优先关系表\\n\
printf(\printf(\printf(\printf(\printf(\printf(\printf(\printf(\
printf(\请输入要进行分析的句子(以#号结束输入):
get(input);
//将输入的字符串存到数组中
fprintf(fp,\需要分析的字符串为:
printf(\步骤栈优先关系当前符号剩余输入串约\\n\k=0;
AnalyeStack[k+1]='
intlength,i;
//初始化剩余字符串数组为输入串length=trlen(input);
//for(i=0;
i
remain[i]=input[i];
移进或归
remain[i]='
analye();
//对所输入的句子进行算符优先分析过程的函数
四、测试结果
输入串(i+i)某i的算符优先分析过程
输入串i+i)某i的算符优先分析过程
五、小结(包括收获、心得体会、存在的问题及解决问题的方法、建议等)
本次实验是算符优先分析法,这种方法特别有利于表达式分析,宜于手工实现。
算符优先分析过程是自下而上的规约过程,但这种规约未必是严格的最左规约,也就是说,算符优先分析法不是一种规范规约法。
通过这次实验,我对编译原理的理解又加深了一步。
本次试验很难,所以求助于网络和同学,然后经过自己的更改编辑,将结果存入名为li的文件中。
虽然对编程依旧感觉很困难,但是经过这次实验,我对存写文件,以及算符优先分析法的理解与学习又上升了一个台阶。