编译原理实验4递归下降分析法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验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
输出的格式如下:
(3)
备注:输入一符号串如i+i*#,要求输出为“非法的符号串”。
注意:
1.表达式中允许使用运算符(+-*/)、分割符(括号)、字符I,结束符#;
2.如果遇到错误的表达式,应输出错误提示信息(该信息越详细越好)。
三、实验方法
用C语言,根据递归下降分析法的规则编写代码,并测试。
四、实验步骤
1.对语法规则有明确的定义;
2.编写的分析程序能够对实验一的结果进行正确的语法分析;
3.对于遇到的语法错误,能够做出简单的错误处理,给出简单的错误提示,保证顺利完成
语法分析过程;
五、实验结果
六、实验结论
#include
#include
#include
#include
char a[50],b[50],d[200],e[10];
char ch;
int numOfEq,i1=0,flag=1,n=6;
int E();
int E1();
int T();
int G();
int S();
int F();
void input();
void input1();
void output();
//================================================ void main()/*递归分析*/
{ int foe1,i=0;
char x;
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");
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;}
}
//================================================ int E1()
{ int fot,fog;
printf("E->TG\t");
flag=1;
input();
input1();
fot=T();
if (fot==0) return(0);
fog=G();
if (fog==0) return(0);
else return(1); }
//================================================ int E()
{ int fot,fog;
printf("E->TG\t");
e[0]='E';
e[1]='=';
e[2]='>';
e[3]='?';
e[4]='T';
e[6]='#';
output();
flag=1;
input();
input1();
fot=T();
if (fot==0) return(0);
fog=G();
if (fog==0) return(0);
else return(1); }
//================================================ int T()
{ int fof,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);
else return(1); }
//================================================ int G()
{ int fot;
if(ch=='+')
{ b[i1]=ch;
printf("G->+TG\t");
e[0]='G';