编译原理实验4递归下降分析法.docx
《编译原理实验4递归下降分析法.docx》由会员分享,可在线阅读,更多相关《编译原理实验4递归下降分析法.docx(14页珍藏版)》请在冰豆网上搜索。
编译原理实验4递归下降分析法
《编译原理》
实验报告
项目名称递归下降分析法设计与实现
专业班级
学号
姓名
实验成绩:
批阅教师:
年月日
实验4《递归下降分析法设计与实现》
实验学时:
2实验地点:
实验日期:
一、实验目的
根据某一文法编制调试递归下降分析程序,以便对任意输入的符号串进行分析。
本次实验的目的主要是加深对递归下降分析法的理解。
二、实验内容
程序输入/输出示例(以下仅供参考):
对下列文法,用递归下降分析法对任意输入的符号串进行分析:
(1)E-TG
(2)G-+TG|—TG
(3)G-ε
(4)T-FS
(5)S-*FS|/FS
(6)S-ε
(7)F-(E)
(8)F-i
输出的格式如下:
(1)递归下降分析程序,编制人:
姓名,学号,班级
(2)输入一以#结束的符号串(包括+—*/()i#):
在此位置输入符号串例如:
i+i*i#
(3)输出结果:
i+i*i#为合法符号串
备注:
输入一符号串如i+i*#,要求输出为“非法的符号串”。
注意:
1.表达式中允许使用运算符(+-*/)、分割符(括号)、字符I,结束符#;
2.如果遇到错误的表达式,应输出错误提示信息(该信息越详细越好)。
三、实验方法
用C语言,根据递归下降分析法的规则编写代码,并测试。
四、实验步骤
1.对语法规则有明确的定义;
2.编写的分析程序能够对实验一的结果进行正确的语法分析;
3.对于遇到的语法错误,能够做出简单的错误处理,给出简单的错误提示,保证顺利完成语法分析过程;
五、实验结果
六、实验结论
#include
#include
#include
#include
chara[50],b[50],d[200],e[10];
charch;
intnumOfEq,i1=0,flag=1,n=6;
intE();
intE1();
intT();
intG();
intS();
intF();
voidinput();
voidinput1();
voidoutput();
//================================================
voidmain()/*递归分析*/
{intfoe1,i=0;
charx;
d[0]='E';
d[1]='=';
d[2]='>';
d[3]='?
';
d[4]='T';
d[5]='G';
d[6]='#';
printf("请输入字符串(以#号结束)\n");
do{scanf("%c",&ch);
a[i]=ch;
i++;}
while(ch!
='#');
numOfEq=i;
ch=b[0]=a[0];
printf("文法\t分析串\t\t分析字符\t剩余串\n");
foe1=E1();
if(foe1==0)return;
if(ch=='#')
{printf("accept\n");
i=0;
x=d[i];
while(x!
='#')
{printf("%c",x);
i=i+1;x=d[i];/*输出推导式*/}
printf("\n");
}
else
{printf("error\n");
printf("回车返回\n");
getchar();getchar();
return;}
}
//================================================
intE1()
{intfot,fog;
printf("E->TG\t");
flag=1;
input();
input1();
fot=T();
if(fot==0)return(0);
fog=G();
if(fog==0)return(0);
elsereturn
(1);}
//================================================
intE()
{intfot,fog;
printf("E->TG\t");
e[0]='E';
e[1]='=';
e[2]='>';
e[3]='?
';
e[4]='T';
e[5]='G';
e[6]='#';
output();
flag=1;
input();
input1();
fot=T();
if(fot==0)return(0);
fog=G();
if(fog==0)return(0);
elsereturn
(1);}
//================================================
intT()
{intfof,fos;
printf("T->FS\t");
e[0]='T';
e[1]='=';
e[2]='>';
e[3]='?
';
e[4]='F';
e[5]='S';
e[6]='#';
output();
flag=1;
input();
input1();
fof=F();
if(fof==0)return(0);
fos=S();
if(fos==0)return(0);
elsereturn
(1);}
//================================================
intG()
{intfot;
if(ch=='+')
{b[i1]=ch;
printf("G->+TG\t");
e[0]='G';
e[1]='=';
e[2]='>';
e[3]='?
';
e[4]='+';
e[5]='T';
e[6]='G';
e[7]='#';
output();
flag=0;
input();
input1();
ch=a[++i1];
fot=T();
if(fot==0)return(0);
G();
return
(1);
}
elseif(ch=='-')
{b[i1]=ch;
printf("G->-TG\t");
e[0]='G';
e[1]='=';
e[2]='>';
e[3]='?
';
e[4]='-';
e[5]='T';
e[6]='G';
e[7]='#';
output();
flag=0;
input();
input1();
ch=a[++i1];
fot=T();
if(fot==0)return(0);
G();
return
(1);}
printf("G->^\t");
e[0]='G';
e[1]='=';
e[2]='>';
e[3]='?
';
e[4]='^';
e[5]='#';
output();
flag=1;
input();
input1();
return
(1);}
//================================================
intS()
{intfof,fos;
if(ch=='*')
{b[i1]=ch;
printf("S->*FS\t");
e[0]='S';e[1]='=';e[2]='>';e[3]='?
';e[4]='*';e[5]='F';e[6]='S';e[7]='#';
output();
flag=0;
input();input1();
ch=a[++i1];
fof=F();
if(fof==0)
return(0);
fos=S();
if(fos==0)return(0);
elsereturn
(1);}
elseif(ch=='/')
{b[i1]=ch;printf("S->/FS\t");
e[0]='S';e[1]='=';e[2]='>';e[3]='?
';e[4]='/';e[5]='F';e[6]='S';e[7]='#';
output();
flag=0;
input();input1();
ch=a[++i1];
fof=F();
if(fof==0)return(0);
fos=S();
if(fos==0)return(0);
elsereturn
(1);}
printf("S->^\t");
e[0]='S';e[1]='=';e[2]='>';e[3]='?
';e[4]='^';e[5]='#';
output();
flag=1;
a[i1]=ch;
input();input1();
return
(1);}
//================================================
intF()
{intf;
if(ch=='(')
{b[i1]=ch;
printf("F->(E)\t");
e[0]='F';e[1]='=';e[2]='>';e[3]='?
';e[3]='(';e[4]='E';e[5]=')';e[7]='#';
output();
flag=0;
input();input1();
ch=a[++i1];
f=E();
if(f==0)return(0);if(ch==')')
{b[i1]=ch;
printf("F--(E)\t");
flag=0;
input();input1();
ch=a[++i1];}
else
{printf("error\n");
return(0);}}
elseif(ch=='i')
{b[i1]=ch;
printf("F->i\t");
e[0]='F';e[1]='=';e[2]='>';e[3]='?
';e[4]='i';e[5]='#';
output();
flag=0;
input();input1();
ch=a[++i1];}
else
{printf("error\n");
return(0);}
return
(1);}
//================================================
voidinput()
{inti=0;
for(;i<=i1-flag;i++)
printf("%c",b[i]);/*输出分析串*/
printf("\t\t");
printf("%c\t\t",ch);/*输出分析字符*/}
//================================================
voidinput1()
{inti;
for(i=i1+1-flag;iprintf("%c",a[i]);/*输出剩余字符*/
printf("\n");}
//================================================
voidoutput()
{/*推导式计算*/
intm,k,j,q;
inti=0;
m=0;
k=0;
q=0;
i=n;
d[n]='=';
d[n+1]='>';
d[n+2]='?
';
d[n+3]='#';
n=n+3;
i=n;
i=i-2;
while(d[i]!
='?
'&&i!
=0)
i--;
i=i+1;
while(d[i]!
=e[0])
i=i+1;
q=i;
m=q;
k=q;
while(d[m]!
='?
')
m=m-1;
m=m+1;
while(m!
=q)
{d[n]=d[m];
m=m+1;
n=n+1;}
d[n]='#';
for(j=3;e[j]!
='#';j++)
{d[n]=e[j];
n=n+1;}
k=k+1;
while(d[k]!
='=')
{d[n]=d[k];
n=n+1;
k=k+1;}
d[n]='#';
}
七、实验小结
通过本次试验实践掌握了自上而下语法分析法的特点。
掌握了递归下降语法分析的基本原理和方法。
运用递归下降分析法完成了本试验的语法分析构造,并且成功的分析出每种正确的句子和错误的句子。
函数的构造是根据文法分析的递归过程,所编写每个函数的功能,以文法的右部为函数名,对应的左部为相应分析过程。
此分析法简单,直观,易构造分析程序,但是不适于文法过于复杂的,不易检查出错误。
在试验的过程中,遇到了一些问题,都是粗心大意而造成,并非是对文法分析和编程的熟悉问题,说明了我再以后的试验中应该更细心的编写程序的每一步,对于本次试验所出现的马虎,应该牢记,以后不再犯同样的错误。