递归下降分析法.doc
《递归下降分析法.doc》由会员分享,可在线阅读,更多相关《递归下降分析法.doc(11页珍藏版)》请在冰豆网上搜索。
编译原理课程实验报告
班级学号:
姓名:
实验名称:
递归下降分析法
一、实验目的:
根据某一文法编制调试递归下降分析程序,以便对任意输入的符号串进行分析。
本次实验的目的主要是加深对递归下降分析法的理解。
二、实验要求:
对下列文法,用递归下降分析法对任意输入的符号串进行分析:
(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.如果遇到错误的表达式,应输出错误提示信息(该信息越详细越好);
三、实验过程:
程序设计:
1.模块设计:
将程序分成合理的多个模块(函数),每个模块做具体的同一事情。
2.写出(画出)设计方案:
模块关系简图、流程图、全局变量、函数接口等。
程序编写:
1.定义部分:
定义常量、变量、数据结构。
2.初始化:
从文件将输入符号串输入到字符缓冲区中。
3.利用递归下降分析法,对每个非终结符编写函数,在主函数中调用文法开始符号的函数。
四、实验结果
(1)程序流程图
开始
输入待处理的字符串
得到字符串的长度
将开始符E放入堆栈
得到第一个字符token
递归下降分析
输出信息
结束
开始
输出分析栈内容和当前动作
将分析栈的E换成EG
是TG
return1
return0
Y
N
主函数main()流程图E()过程流程图
开始
输出分析栈内容和当前动作
将分析栈的T换成FS
是FS
return1
return0
Y
N
T()过程流程图
将分析栈的G换成TG
是TG
开始
token是+
token是-
输出分析栈信息
输出分析栈信息
输出分析栈信息
匹配+
匹配-
返回
return1
return0
Y
Y
N
N
Y
N
G()过程流程图
开始
token是(
token是i
输出错误
输出分析栈信息
将分析栈最后一个元素换成E
输出分析栈信息
匹配i
匹配(
进行E过程
匹配)
N
N
Y
Y
F()过程流程图
开始
输出分析栈信息
token是*
token是/
将栈顶元素弹出
匹配*
匹配/
将堆栈栈顶元素换成FS
F过程
S过程
结束
S()过程流程图
(2)运行结果
示例程序:
#include
#include
#include
#include
chara[50],b[50],d[500],e[10];
charch;
intn1,i1=0,flag=1,n=5;
intE();
intE1();
intT();
intG();
intS();
intF();
voidinput();
voidinput1();
voidoutput();
voidmain()/*递归分析*/
{
intf,p,j=0;
charx;
d[0]='E';
d[1]='=';
d[2]='>';
d[3]='T';
d[4]='G';
d[5]='#';
printf("递归下降分析程序,编制人:
___,____,_________\n");
printf("输入一以#结束的符号串(包括+-*/()i#,且长度小于50):
");
do{
scanf("%c",&ch);
a[j]=ch;
j++;
}while(ch!
='#');
n1=j;
ch=b[0]=a[0];
printf("文法\t分析串\t\t\t分析字符\t\t剩余串\n");
f=E1();
if(f==0)return;
if(ch=='#')
{printf("accept\n");
p=0;
x=d[p];
while(a[p]!
='#')
printf("%c",a[p++]);
printf("为合法字符!
\n");
}
else{
// printf("error\n");
j=0;
while(a[j]!
='#')
printf("%c",a[j++]);
printf("非法字符!
\n");
printf("回车返回\n");
getchar();getchar();
return;
}
printf("\n");
printf("回车返回\n");
getchar();
getchar();
}
intE1()
{intf,t;
printf("E-->TG\t");
flag=1;
input();
input1();
f=T();
if(f==0)return(0);
t=G();
if(t==0)return(0);
elsereturn
(1);
}
intE()
{intf,t;
printf("E-->TG\t");
e[0]='E';e[1]='=';e[2]='>';e[3]='T';e[4]='G';e[5]='#';
output();
flag=1;
input();
input1();
f=T();
if(f==0)
return(0);
t=G();
if(t==0)return(0);
elsereturn
(1);
}
intT()
{intf,t;
printf("T-->FS\t");
e[0]='T';e[1]='=';e[2]='>';e[3]='F';e[4]='S';e[5]='#';
output();
flag=1;
input();
input1();
f=F();
if(f==0)
return(0);
t=S();
if(t==0)return(0);
elsereturn
(1);
}
intG()
{
intf;
if(ch=='+')
{
b[i1]=ch;
printf("G-->+TG\t");
e[0]='G';e[1]='=';e[2]='>';e[3]='+';e[4]='T';e[5]='G';e[6]='#';
output();
flag=0;
input();input1();
ch=a[++i1];
f=T();
if(f==0)
return(0);
f=G();
if(f==0)
return0;
elsereturn1;
}
elseif(ch=='-')
{
b[i1]=ch;
printf("G-->-TG\t");
e[0]='G';e[1]='=';e[2]='>';e[3]='-';e[4]='T';e[5]='G';e[6]='#';
output();
flag=0;
input();input1();
ch=a[++i1];
f=T();
if(f==0)
{
return(0);
}
f=G();
if(f==0)
return0;
elsereturn1;
}
else
{
printf("G-->^\t");
e[0]='G';e[1]='=';e[2]='>';e[3]='^';e[4]='#';
output();
flag=1;
input();input1();
return
(1);
}
}
intS()
{
intf,t;
if(ch=='*')
{
b[i1]=ch;
printf("S-->*FS\t");
e[0]='S';e[1]='=';e[2]='>';e[3]='*';e[4]='F';e[5]='S';e[6]='#';
output();
flag=0;
input();input1();
ch=a[++i1];
f=F();
if(f==0)
return(0);
t=S();
if(t==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]='F';e[5]='S';e[6]='#';
output();
flag=0;
input();input1();
ch=a[++i1];
f=F();
if(f==0)
return(0);
t=S();
if(t==0)
return(0);
elsereturn
(1);}
else
{
printf("S-->^\t");
e[0]='S';e[1]='=';e[2]='>';e[3]='^';e[4]='#';
output();
flag=1;
a[i1]=ch;
input();input1();
return
(1);
}
}
intF()
{intf;intj;
if(ch=='(')
{
b[i1]=ch;
printf("F-->(E)\t");
e[0]='F';e[1]='=';e[2]='>';e[3]='(';e[4]='E';e[5]=')';e[6]='#';
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];
}