编译原理实验Word格式文档下载.docx

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

编译原理实验Word格式文档下载.docx

《编译原理实验Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《编译原理实验Word格式文档下载.docx(7页珍藏版)》请在冰点文库上搜索。

编译原理实验Word格式文档下载.docx

给出有意义的错误信息和错误发生的行数。

词法错误类型有:

非法字符,即不是SAMPLE字符集的符号;

字符常数缺右边的单引号(字符常数要求左、右边用单引号界定,不能跨行);

注释部分缺右边的界符*/(注释要求左右边分别用/*和*/界定,不能跨行)。

Ø

非法字符,即不是TINY+字符集的符号,例如$是个非法符号

字符常数缺少右边的单引号:

例如:

'

scanner

注释部分缺少右边的界符

{thisisanexample

要求

1编程语言用C或C++

2这个实验必须在8学时内完成,现场检查实验结果。

需要提交实验报告和源码。

某些TINY+程序的样例输出

Test1

truefalseorandnot

intboolstringwhiledo

ifthenelseendrepeat

untilreadwrite,;

:

=+-*/

()<

=>

<

=>

=a2c123'

EFG'

Thescannershouldgivetheoutputs:

(KEY,true)(KEY,false)(KEY,or)(KEY,and)

(KEY,not)(KEY,int)(KEY,bool)(KEY,string)

(KEY,while)(KEY,do)(KEY,if)(KEY,then)

(KEY,else)(KEY,end)(KEY,repeat)(KEY,until)

(KEY,read)(KEY,write)(SYM,,)(SYM,;

(SYM,:

=)(SYM,+)(SYM,-)(SYM,*)

(SYM,/)(SYM,()(SYM,))(SYM,<

(SYM,=)(SYM,>

)(SYM,<

=)(SYM,>

=)

(ID,a2c)(NUM,123)(STR,EFG)

Test2

{thisisanexample}

intA,B;

boolC;

stringD;

D:

='

scanner'

;

C:

=AandnotB;

whileA<

=Ddo

A:

=A*2

end

(KEY,int)(ID,A)(SYM,,)(ID,B)

(SYM,;

)(KEY,bool)(ID,C)(SYM,;

(KEY,string)(ID,D)(SYM,;

)(ID,D)

=)(STR,scanner)(SYM,;

)(ID,C)

=)(ID,A)(KEY,and)(KEY,not)

(ID,B)(SYM,;

)(KEY,while)(ID,A)

(SYM,<

=)(ID,D)(KEY,do)(ID,A)

=)(ID,A)(SYM,*)(NUM,2)

(KEY,end)

实验2

TINY+语言的语法分析、语义分析和中间代码生成实验

为TINY+语言编写语法分析程序、语义分析程序肯中间代码生成程序。

Goals

5实现TINY+语言的递归下降语法分析程序,可以对词法分析程序产生的记号组成的串进行语法。

分析程序的输出是抽象的语法树。

6语义分析程序建立符号表并检查语义错误。

7中间代码生成程序将任何一段TINY+程序翻译成三地址中间代码。

8可以检测语法和语义错误

a)语法错误:

开始符号和后跟符号错误;

标识符错误,例如int后面不是标识符;

括号匹配错误,例如(和)不匹配

符号错误,例如在赋值语句中,符号应该为‘:

=’,在比较表达式中符号应该为‘=’

b)语义错误:

使用标识符前没有声明,或标识符被多次声明;

条件表达式的类型不是bool

运算对象的类型不相同

赋值号左边和右边的类型不相同

一些TINY+程序的样例输出

intA,B,C,D;

CandB>

Ddo

ifA=1thenA:

=B*C+37

elserepeatA:

=A*2

until(A+C)<

=(B+D)

输出是

注意:

Wesupposestmt-sequence.next=L0,thatisthelabelattachedtothefirstthree-addressinstructiontobeexecutedafterthecodeforstmt-sequence(therootofthesyntaxtree)willalwaysbeL0

1)LabelL1

2)ifA=1gotoL3

3)gotoL4

4)LabelL3

5)t1:

=B*C

6)t2:

=t1+37

7)A:

=t2

8)gotoL2

9)LabelL4

10)LabelL5

11)t3:

12)A:

=t3

13)LabelL6

14)t4:

=A+C

15)t5:

=B+D

16)ift4<

=t5gotoL2

17)gotoL5

18)LabelL2

19)ifA<

CgotoL7

20)gotoL0

21)LabelL7

22)ifB>

DgotoL1

23)gotoL0

24)LabelL0

Test2

intx,fact;

readx;

ifx>

0andx<

100then{don’tcomputeifx<

=0}

fact:

=1;

whilex>

0do

fact:

=fact*x;

x:

=x-1

end;

writefact

输出是:

1)readx;

2)LabelL1

3)ifx>

0gotoL3

4)gotoL0

5)LabelL3

6)ifx<

100gotoL2

7)gotoL0

8)LabelL2

9)fact:

=1

10)LabelL4

11)LabelL6

12)ifx>

0gotoL7

13)gotoL5

14)labelL7

15)t1:

=fact*x

16)fact:

=t1

17)LabelL8

18)t2:

19)x:

20)gotoL6

21)LabelL5

22)writefact

23)LabelL0

说明:

中间代码的生成,由于处理顺序的不同,代码的标号可能和示例的结果不完全一致,只要符合逻辑就都是正确的。

附:

控制语句用于代码生成的属性文法

Seq->

S;

Seq1

{S.next=newlabel;

Seq1.next=Seq.next;

Seq.code=S.code||LabelS.next||Seq1.code}

S

{S.next=Seq.next;

Seq.code=S.code}

S->

repeatSequntilE

{S.begin=newlabel;

Seq.next=newlabel;

E.true=S.next;

E.false=S.begin;

S.code=LabelS.begin||Seq.code||LabelSeq.next||E.code}

whileEdoSeqend

{S.begin=newlabelSeq.next=S.begin

E.true=newlabelE.false=S.next

S.code=LabelS.begin||E.code||LabelE.true||Seq.code||gotoS.begin}

ifEthenSeqend

{E.true=newlabel;

E.false=S.next;

Seq.next=S.next

S.code=E.code||Label.E.ture||Seq.code}

ifEthenSeq1elseSeq2end

{E.ture=newlabel;

E.false=newlabel;

Seq1.next=S.next;

Seq2.next=S.next;

S.code=E.code||LabelE.true||Seq1.code||gotoS.next||LabelE.fasle||Seq2.code

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

当前位置:首页 > 医药卫生 > 基础医学

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

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