南昌大学编译原理实验报告二.docx
《南昌大学编译原理实验报告二.docx》由会员分享,可在线阅读,更多相关《南昌大学编译原理实验报告二.docx(12页珍藏版)》请在冰豆网上搜索。
![南昌大学编译原理实验报告二.docx](https://file1.bdocx.com/fileroot1/2023-1/7/7dbea088-1006-431a-ab40-83f611d1f63f/7dbea088-1006-431a-ab40-83f611d1f63f1.gif)
南昌大学编译原理实验报告二
南昌大学实验报告二
实验类型:
□验证□综合■设计□创新实验日期:
2013.5实验成绩:
一、实验目的
通过设计、编制、调试一个典型的语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查和结构分析,进一步掌握常用的语法分析中递归下降分析方法。
二、实验内容
设计一个文法的递归下降分析程序,判断特定表达式的正确性。
三、实验要求
1、给出文法如下:
G[E]
E->T|E+T;
T->F|T*F;
F->i|(E);
2、根据该文法构造相应的LL
(1)文法及LL
(1)分析表,并为该文法设计预测分析程序,利用C语言或C++语言实现;
3、利用预测分析程序完成下列功能:
1)手工将测试的表达式写入文本文件,每个表达式写一行,用“;”表示结束;
2)读入文本文件中的表达式;
3)调用实验一中的词法分析程序搜索单词;
4)把单词送入预测分析程序,判断表达式是否正确(是否是给出文法的语言),若错误,应给出错误信息;
5)完成上述功能,有余力的同学可以进一步完成通过程序实现对非LL
(1)文法到LL
(1)文法的自动转换。
四、实验环境
PC微机
DOS操作系统或Windows操作系统
TurboC程序集成环境或VisualC++程序集成环境
五、实验步骤
1、分析文法,将给出的文法转化为LL
(1)文法;
2、学习预测分析程序的结构,设计合理的预测分析程序;
3、编写测试程序,包括表达式的读入和结果的输出;
4、测试程序运行效果,测试数据可以参考下列给出的数据。
六、测试数据
输入数据:
编辑一个文本文文件expression.txt,在文件中输入如下内容:
10;
1+2;
(1+2)*3+(5+6*7);
((1+2)*3+4;
1+2+3+(*4+5);
(a+b)*(c+d);
((ab3+de4)**5)+1;
正确结果:
(1)10;
输出:
正确
(2)1+2;
输出:
正确
(3)(1+2)*3+(5+6*7);
输出:
正确
(4)((1+2)*3+4
输出:
错误
(5)1+2+3+(*4+5)
输出:
错误
(6)(a+b)*(c+d)
输出:
正确
(7)((ab3+de4)**5)+1
输出:
错误
实验代码:
以下分别用递归下降和预测分析两种方法进行编程
递归下降:
#include
usingnamespacestd;
chart[100];
chars[100];
inti,SIGN,j;
voidE();
voidE1();
voidE2();
voidT();
voidT1();
voidF();
boolF1(chark);
intmain()
{
cout<<"请输入一个语句,以#号结束语句(直接输入#号推出)"<while
(1)
{
cin>>t;
E2();
SIGN=0;
i=0;
if(s[0]=='#')
return0;
E();
if(s[i]=='#')
cout<<"正确语句!
"<cout<<"请输入一个语句,以#号结束语句"<}
return1;
}
voidE()
{
if(SIGN==0)
{
T();
E1();
}
}
voidE1()
{
if(SIGN==0)
{
if(s[i]=='+')
{
++i;
T();
E1();
}
elseif(s[i]!
='#'&&s[i]!
=')')
{
cout<<"语句有误!
"<SIGN=1;
}
}
}
voidT()
{
if(SIGN==0)
{
F();
T1();
}
}
voidT1()
{
if(SIGN==0)
{
if(s[i]=='*')
{
++i;
F();
T1();
}
elseif(s[i]!
='#'&&s[i]!
=')'&&s[i]!
='+')
{
cout<<"语句有误!
"<SIGN=1;
}
}
}
voidF()
{
if(SIGN==0)
{
if(s[i]=='(')
{
++i;
E();
if(s[i]==')')
++i;
elseif(s[i]=='#')
{
cout<<"语句有误!
"<SIGN=1;
++i;
}
}
elseif(s[i]=='i')
++i;
else
{
cout<<"语句有误!
"<SIGN=1;
}
}
}
voidE2()
{
i=0;
j=0;
while(t[j]!
='#')
{
if(F1(t[j]))
{
j++;
while(F1(t[j])){j++;}
s[i++]='i';
}
elses[i++]=t[j++];
}
s[i]='#';
}
boolF1(chark)
{
if(k>='0'&&k<='9')returntrue;
elseif(k>='a'&&k<='z')returntrue;
elsereturnfalse;
}
实验截图:
预测分析:
#include
usingnamespacestd;
charVT[6]={'i','(',')','*','+','#',};
intob[5][6]={
{1,0,0,1,0,0},
{0,1,0,0,2,2},
{1,0,0,1,0,0},
{0,2,1,0,2,2},
{2,0,0,1,0,0}
};
intp(charc)
{
switch(c)
{
case'E':
return0;break;
case'B':
return1;break;
case'T':
return2;break;
case'C':
return3;break;
case'F':
return4;break;
case'i':
return0;break;
case'+':
return1;break;
case'*':
return2;break;
case'(':
return3;break;
case')':
return4;break;
case'#':
return5;break;
default:
return6;break;
}
}
boolV(charc)
{
inti;
for(i=0;i<6;i++)
{
if(c==VT[i])return1;
}
return0;
}
classLL1
{
private:
chars[100];
intj;
public:
LL1(){s[0]='#';s[1]='E';j=1;}
charg(){returns[j];}
intgc(){returnj;}
voidshow(){cout<
voidcj(){j--;}
voidchange(inti)
{
if(s[j]=='E'&&i==1){s[j++]='B';s[j]='T';}
elseif(s[j]=='B'&&i==1){s[j++]='B';s[j++]='T';s[j]='+';}
elseif(s[j]=='B'&&i==2){j--;}
elseif(s[j]=='T'&&i==1){s[j++]='C';s[j]='F';}
elseif(s[j]=='C'&&i==1){s[j++]='C';s[j++]='F';s[j]='*';}
elseif(s[j]=='C'&&i==2){j--;}
elseif(s[j]=='F'&&i==1){s[j++]=')';s[j++]='E';s[j]='(';}
elseif(s[j]=='F'&&i==2){s[j]='i';}
elsecout<<"推导出错"<}
};
voidmain()
{
FILE*t;
charin[30];
chara,c;
cout<<"请输入源文件名(包括路径和后缀名):
";
for(;;){
cin>>in;
if((t=fopen(in,"r"))!
=NULL)break;
elsecout<<"文件路径错误!
请输入源文件名(包括路径和后缀名):
";
}
while((a=getc(t))!
=EOF)
{
LL1S;
cout<<"原式"<if(p(a)==6){a='i';c=a;}
while
(1)
{
if(V(S.g()))
{
if(S.g()=='#'&&a=='#'){a=getc(t);break;}
elseif(S.g()==a)
{S.cj();
while
(1)
{
c=a;
a=getc(t);
cout<if(a==';'){a='#';}
if(p(a)==6){a='i';}
if(c!
='i'||a!
='i')break;
}
continue;}
else{
if(a=='#')break;
while(a!
=';'){a=getc(t);cout<break;}
}
elseif(ob[p(S.g())][p(a)]>0)
{
S.change(ob[p(S.g())][p(a)]);continue;
}
else{
if(a=='#')break;
while(a!
=';'){a=getc(t);cout<break;
}
}
if(S.gc()==0){cout<<"符合LL
(1)文法"<else{a=getc(t);cout<<"不符合LL
(1)文法"<}
system("pause");
}
实验截图: