南昌大学编译原理实验报告二.docx

上传人:b****6 文档编号:6528932 上传时间:2023-01-07 格式:DOCX 页数:12 大小:100.29KB
下载 相关 举报
南昌大学编译原理实验报告二.docx_第1页
第1页 / 共12页
南昌大学编译原理实验报告二.docx_第2页
第2页 / 共12页
南昌大学编译原理实验报告二.docx_第3页
第3页 / 共12页
南昌大学编译原理实验报告二.docx_第4页
第4页 / 共12页
南昌大学编译原理实验报告二.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

南昌大学编译原理实验报告二.docx

《南昌大学编译原理实验报告二.docx》由会员分享,可在线阅读,更多相关《南昌大学编译原理实验报告二.docx(12页珍藏版)》请在冰豆网上搜索。

南昌大学编译原理实验报告二.docx

南昌大学编译原理实验报告二

南昌大学实验报告二

实验类型:

□验证□综合■设计□创新实验日期:

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");

}

实验截图:

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1