编译原理实验报告二.docx

上传人:b****5 文档编号:7280958 上传时间:2023-05-11 格式:DOCX 页数:13 大小:37.17KB
下载 相关 举报
编译原理实验报告二.docx_第1页
第1页 / 共13页
编译原理实验报告二.docx_第2页
第2页 / 共13页
编译原理实验报告二.docx_第3页
第3页 / 共13页
编译原理实验报告二.docx_第4页
第4页 / 共13页
编译原理实验报告二.docx_第5页
第5页 / 共13页
编译原理实验报告二.docx_第6页
第6页 / 共13页
编译原理实验报告二.docx_第7页
第7页 / 共13页
编译原理实验报告二.docx_第8页
第8页 / 共13页
编译原理实验报告二.docx_第9页
第9页 / 共13页
编译原理实验报告二.docx_第10页
第10页 / 共13页
编译原理实验报告二.docx_第11页
第11页 / 共13页
编译原理实验报告二.docx_第12页
第12页 / 共13页
编译原理实验报告二.docx_第13页
第13页 / 共13页
亲,该文档总共13页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

编译原理实验报告二.docx

《编译原理实验报告二.docx》由会员分享,可在线阅读,更多相关《编译原理实验报告二.docx(13页珍藏版)》请在冰点文库上搜索。

编译原理实验报告二.docx

编译原理实验报告二

深圳大学实验报告

 

课程名称:

编译原理

实验项目名称:

语法分析--递归下降法

学院:

计算机与软件

专业:

软件工程

指导教师:

张小建

报告人:

文成学号:

2011150259班级:

2

实验时间:

2013-12-25

实验报告提交时间:

2013-12-26

 

教务部制

一、实验目的:

掌握自顶向下的语法分析法——递归下降法。

二、实验内容:

用递归下降法对如下所定义的逻辑表达式进行语法分析。

1L→L||A

2L→A

3A→A&&R

4A→R

5R→[L]

6R→!

L

7R→E>=E

8R→E>E

9R→E<=E

10R→E

11R→E==E

12R→E!

=E

13R→E

14E→E+T

15E→T

16T→T*F

17T→F

18F→(E)

19F→n//数

20F→i//标识符

三、实验设计:

1、消除该文法的左递归(产生式1、3、14、16);

产生式

(1)L→L||A

(2)L→A

消除左递归得到:

L→AL'L'→||AL'|з

产生式(3)A→A&&R(4)A→R

消除左递归得到:

A→RA'A'→&&RA'|з

产生式(14)E→E+T(15)E→T

消除左递归得到:

E→TE'E'→+TE'|з

产生式(16)T→T*F(17)T→F

消除左递归得到:

T→FT'T'→*FT'|з

 

2、通过抽取公共左因子(产生式7~12),对该文法进行LL

(1)改造;

产生式7~12

7R→E>=E

8R→E>E

9R→E<=E

10R→E

11R→E==E

12R→E!

=E

抽取公共左因子:

R→ER'

R'→>=E|>E|<=E|

=E

3、证明最终得到的文法为LL

(1)文法。

对该文法进行LL

(1)改造的结果为:

(01)L→AL'

(02)L'→||AL'|з

(03)A→RA'

(04)A'→&&RA'|з

(05)R→[L]|!

L|ER'

(06)R'→>=E|>E|<=E|

=E

(07)E→TE'

(08)E'→+TE'|з

(09)T→FT'

(10)T'→*FT'|з

(11)F→(E)|n|i

LL

(1)文法的证明:

①首先该文法无左递归存在,没有公共左因子。

②该文法每个非终结符的FIRST无交集

产生式

FIRST

FOLLOW

L→AL'

{[,!

(,n,i}

{],#}

L'→||AL'

→з

{||}

{з}

{],#}

A→RA'

{[,!

(,n,i}

{||,],#}

A'→&&RA'

→з

{&&}

{з}

{||,],#}

R→[L]

→!

L

→ER'

{[}

{!

}

{(,n,i}

{&&,],#}

R'→>=E|>E|<=E|

=E

{>=,>,<=,<,==,!

=}

{&&,],#}

E→TE'

{(,n,i}

{>=,>,<=,<,==,!

=,+,)}

E'→+TE'

→з

{+}

{з}

{>=,>,<=,<,==,!

=,+,)}

T→FT'

{(,n,i}

{*,+}

T'→*FT'

→з

{*}

{з}

{*,+}

F→(E)

→n

→i

{(}

{n}

{i}

{*}

③则可以确定该文法是LL

(1)文法

 

文法相应的LL

(1)分析表如下:

n

i

+

*

[

]

>=...

&&

||

!

#

L

AL'

AL'

AL'

AL'

AL'

L'

з

||AL'

з

A

RA'

RA'

RA'

RA'

RA'

A'

з

&&RA'

з

з

R

ER'

ER'

ER'

[L]

!

L

R'

>=E...

E

TE'

TE'

TE'

E'

з

+TE'/з

з

T

FT

FT

FT

T'

з

*FT'/з

F

(E)

n

i

 

四、源程序:

#include

#include

#include

#include

#include

voiderror();

voidterror();

voidScanner();

charsym='';inti=0;charstrToken[30]={""};

FILE*in;

voidL();

voidL1();

voidA();

voidA1();

voidR();

voidR1();

voidE();

voidE1();

voidT();

voidT1();

voidF();

voidRetract(charstr[30])

{

for(intj=0;j<30;j++)

{

str[j]=0;

}

}

voidScanner()

{

sym=fgetc(in);

if(isspace(sym))

{

while

(1)

{

if(isspace(sym))

{

sym=fgetc(in);

}

elsebreak;

}

}

if(isdigit(sym))

{

while

(1)

{

if(isdigit(sym))

{

strToken[i]=sym;

i++;

sym=fgetc(in);

}

else

{

printf("%s",strToken);

i=0;

Retract(strToken);

fseek(in,-2,1);

sym=fgetc(in);

break;

}

}

}

else

{

if(sym=='+')

printf("+");

elseif(sym=='-')

printf("-");

elseif(sym=='*')

printf("*");

elseif(sym=='/')

printf("/");

elseif(sym=='^')

printf("^");

elseif(sym=='(')

printf("(");

elseif(sym==')')

printf(")");

}

}

voidF()

{

if(isdigit(sym))

Scanner();

elseif(sym=='(')

{

Scanner();

E();

if(sym==')')

Scanner();

elseerror();

}

else

terror();

}

voidT1()

{

if(sym=='*')

{

Scanner();

F();

T();

}

}

voidT()

{

F();

T1();

}

voidE1()

{

if(sym=='+')

{

Scanner();

T();

E1();

}

}

voidE()

{

T();

E1();

}

voidL()

{

A();

L1();

}

L1()

{

if(sym=='+')

{

Scanner();

A();

L1();

}

}

A()

{

R();

A1();

}

A1()

{

if(sym=='&&')

{

Scanner();

R();

A1();

}

}

R()

{

E();

R1();

if(sym=='[')

{

Scanner();

L();

if(sym==']')

Scanner();

}

if(sym=='!

')

{

Scanner();

L();

}

}

R1()

{

if(sym=='>='||'>'||'<='||'<'||'=='||'!

=')

{

Scanner();

E();

}

}

voiderror()

{

printf("Thisisthewrongphrase!

\n");

exit(0);

}

voidterror()

{

printf("Thisisthewrongphrase2!

\n");

exit(0);

}

voidmain()

{

if((in=fopen("input.txt","r"))==NULL)

{

printf("THEFILEDOESN'TOPEN!

");

exit(0);

}

Scanner();

L();

if(sym=='#')

printf("\nsuccess\n");

else

printf("fail");

fclose(in);

}

5、运行结果:

程序输入/输出示例:

输入如下表达式(以分号为结束)和输出结果:

(a)3>5;

输出:

正确

(b)23>>=454;

输出:

正确

(c)2*3>=(2*3*4+3*3)&&[2>3];

输出:

正确

六、心得体会:

这次试验不仅要用到试验一的词法扫描器,还要先对文法进行LL

(1)改造和证明,还是挺困难的,做了很长时间。

大部分时间主要花在设计上,上课讲的很多东西都忘了,需要重新复习下才能开始做。

包括寻找FIRST和FOLLOW,以及构造分析表。

总之,这次试验让我收获很大。

也重新复习了一遍学过的知识。

我了解了语法分析器的内部工作原理,通过在本次实验中运用一定的编程技巧,掌握对表达式进行处理的一种方法,了解了也理解了递归下降分析法的基本原理。

指导教师批阅意见:

成绩评定:

指导教师签字:

年月日

备注:

注:

1、报告内的项目或内容设置,可根据实际情况加以调整和补充。

2、教师批改学生实验报告时间应在学生提交实验报告时间后10日内。

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

当前位置:首页 > 人文社科 > 文学研究

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2