编译原理实验报告二Word文件下载.docx

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

编译原理实验报告二Word文件下载.docx

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

编译原理实验报告二Word文件下载.docx

7R→E>

=E

8R→E>

E

9R→E<

=E

10R→E<

E

11R→E==E

12R→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

抽取公共左因子:

R→ER'

R'

→>

=E|>

E|<

=E|<

E|==E|!

=E

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

(1)文法。

对该文法进行LL

(1)改造的结果为:

(01)L→AL'

(02)L'

(03)A→RA'

(04)A'

(05)R→[L]|!

L|ER'

(06)R'

(07)E→TE'

(08)E'

(09)T→FT'

(10)T'

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

LL

(1)文法的证明:

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

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

产生式

FIRST

FOLLOW

L→AL'

{[,!

(,n,i}

{],#}

L'

→з

{||}

{з}

A→RA'

{||,],#}

A'

{&

}

R→[L]

→!

L

→ER'

{[}

{!

{(,n,i}

],#}

{>

=,>

<

=,<

==,!

=}

E→TE'

{(,n,i}

=,+,)}

E'

{+}

{з}

T→FT'

{*,+}

T'

{*}

F→(E)

→n

→i

{(}

{n}

{i}

则可以确定该文法是LL

(1)文法

文法相应的LL

(1)分析表如下:

n

i

+

*

[

]

>

=...

||

!

#

AL'

з

||AL'

A

RA'

R

ER'

[L]

=E...

E

TE'

+TE'

T

FT

*FT'

F

(E)

四、源程序:

#include<

stdio.h>

#include<

stdlib.h>

string.h>

ctype.h>

conio.h>

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

if(isdigit(sym))

strToken[i]=sym;

i++;

else

printf("

%s"

strToken);

i=0;

Retract(strToken);

fseek(in,-2,1);

break;

}

else

if(sym=='

+'

printf("

+"

);

elseif(sym=='

-'

-"

*'

*"

elseif(sym=='

/'

/"

^'

^"

('

("

)'

)"

}

voidF()

Scanner();

E();

elseerror();

terror();

voidT1()

{

if(sym=='

{

F();

T();

voidT()

F();

T1();

voidE1()

E1();

voidE()

T();

E1();

voidL()

A();

L1();

L1()

A();

L1();

A()

R();

A1();

A1()

'

R();

A1();

R()

E();

R1();

['

L();

]'

R1()

='

||'

<

=='

voiderror()

{

printf("

Thisisthewrongphrase!

\n"

exit(0);

voidterror()

Thisisthewrongphrase2!

voidmain()

if((in=fopen("

input.txt"

"

r"

))==NULL)

printf("

THEFILEDOESN'

TOPEN!

"

exit(0);

Scanner();

L();

#'

\nsuccess\n"

else

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-2022 冰豆网网站版权所有

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