编译原理实验Word格式文档下载.docx
- 文档编号:4153968
- 上传时间:2023-05-02
- 格式:DOCX
- 页数:7
- 大小:17.67KB
编译原理实验Word格式文档下载.docx
《编译原理实验Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《编译原理实验Word格式文档下载.docx(7页珍藏版)》请在冰点文库上搜索。
给出有意义的错误信息和错误发生的行数。
词法错误类型有:
非法字符,即不是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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 实验