递归下降分析法递归下降分析法
实验2.1 递归下降分析法
一、实验目的
1. 根据某一文法编制递归下降分析程序,以便对任意输入的符号串进行分析。
2. 本次实验的目的是加深对递归下降分析法的理解。
二、实验平台
Windows + VC + Win32 Console
三、实验内容
对下列文法,用递归下降分析法对任意输入的符号串进行分析:
(1)E→TG
(2)G→+TG|-TG
(3)G→ε
(4)T→FS
(5)S→*FS|/FS
(6)S→ε
(7)F→(E)
(8)F→i
程序输入/输出示例:
程序现有功能:
输入: ...
递归下降
法
实验2.1 递归下降分析法
一、实验目的
1. 根据某一文法编制递归下降分析程序,以便对任意输入的符号串进行分析。
2. 本次实验的目的是加深对递归下降分析法的理解。
二、实验平台
Windows + VC + Win32 Console
三、实验内容
对下列文法,用递归下降分析法对任意输入的符号串进行分析:
(1)E→TG
(2)G→+TG|-TG
(3)G→ε
(4)T→FS
(5)S→*FS|/FS
(6)S→ε
(7)F→(E)
(8)F→i
程序输入/输出示例:
程序现有功能:
输入: 一个以 # 结束的符号串(包括 + * ( )i # ):
例如:i+i*i#
输出:
(1) 详细的分析步骤, 包括
每一步使用的产生式、已分析过的串、当前分析字符、剩余串,
(2) 分析结果:accept 或者 error
(3) 推导序列
需要完善的功能:
(1)示例程序只能完成 + 、* 、(、)的语法分析, 请加入 - 和 / 的语法分析
(2)将示例程序输出的推导序列中的推导符号由 = 改为 =>
四、程序代码
#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("请输入字符串(长度<50,以#号结束)\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;
}
}
//================================================
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[5]='G';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';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);
}
else 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);
}
printf("G->^\t");
e[0]='G';e[1]='=';e[2]='>';e[3]=' ';e[4]='^';e[5]='#';
output();
flag=1;
input();input1();
return(1);
}
//================================================
int S()
{
int fof,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);
else return(1);
}
else 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);
else return(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);
}
//================================================
int F()
{
int f;
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);
}
}
else if(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);
}
//================================================
void input()
{
int i=0;
for (;i<=i1-flag;i++)
printf("%c",b[i]); /*输出分析串*/
printf("\t\t");
printf("%c\t\t",ch); /*输出分析字符*/
本文档为【递归下降分析法】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。