实验指导书编译原理.doc

上传人:叶*** 文档编号:35090029 上传时间:2022-08-20 格式:DOC 页数:17 大小:46KB
返回 下载 相关 举报
实验指导书编译原理.doc_第1页
第1页 / 共17页
实验指导书编译原理.doc_第2页
第2页 / 共17页
点击查看更多>>
资源描述

《实验指导书编译原理.doc》由会员分享,可在线阅读,更多相关《实验指导书编译原理.doc(17页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、编译原理实验教学指导书计算机科学与工程学院华南理工大学目录1 实验简介32 TINY+语言介绍42.1 TINY+语言的词法定义42.2 TINY+的语法定义52.3 TINY+的语义定义72.4 用TINY+语言编写的示例程序73 实验1:实现TINY+语言的词法分析器93.1 实验目的93.2 实验要求103.3 TINY+的测试程序及词法分析器的输出104 实验2:实现TINY+的语法分析器、语义分析器以及中间代码生成器134.1 实验目的134.2 实验要求144.3 TINY+示例程序及其输出14附录:和TINY+文法规则对应的生成三地址中间代码的属性文法161 实验简介学生在实验中

2、,构造一个将TINY+高级程序设计语言转换为TINY+虚拟机上的中间代码的编译器。整个实验包括两个部分:实验一完成TINY+编译器的词法分析器部分;实验二完成TINY+编译器的语法分析器部分、语义分析器部分及中间代码生成器部分。每个同学必须独立完成自己的实验,与其他同学的讨论或合作是允许的,但必须是有限度的,可以互相交流想法和方法,但不能抄袭。学术不端将导致成绩为零。 TINY+的编译器必须用C语言或C+语言实现(推荐使用Microsoft Visual Studio)。2 TINY+语言介绍实验定义了一种叫TINY+的高级程序设计语言,该语言是对TINY语言的一个扩充,TINY+比TINY增

3、加了程序的声明部分,while语句,字符串类型定义等等,在本节的描述中,用蓝色字体标识的是TINY语言原有的词法及语法规定,而用红色字体标识的是TINY+语言扩充的词法及语法规定。本节主要是对TINY+语言的介绍,具体包括: 1) TINY+语言的词法定义,包括对TINY+语言的单词(token)的描述;2) TINY+语言语法结构的EBNF描述;3) TINY+语言主要的语义描述;4) TINY+的实例程序2.1 TINY+语言的词法定义1. TINY+语言的关键字(keyword)包括:orand intboolcharwhiledoifthenelseendrepeatuntilread

4、write 所有的关键字是程序设计语言保留使用的,并且用小写字母表示,用户自己定义的标识符不能和关键字重复。2. 特殊符号的定义如下:3. 其他种类的单词包括标识符ID,数字NUM以及字符串STRING,他们的正规表达式的定义如下:ID=letter (letter | digit)*标识符是以字母开头,由字母和数字混合构成的符号串。NUM=digit digit*TINY+中对数字的定义和TINY相同。STRING= any character except 一个字符串类型的单词是用单引号括起来的字符串,引号内可出现除了 以外的任何符号。一个字符串不能跨行定义。letter=a|z|A|Zd

5、igit=0|9小写和大写字母是不同的。4. 空白包括空格、回车以及Tab。所有的空白在词法分析时,被当作单词ID,NUM以及保留字的分隔符,在词法分析之后,他们不被当作单词保留。5. 注释是用花括号括起来的符号串,注释不能嵌套定义,但注释的定义可以跨行。2.2 TINY+的语法定义TINY+的语法用EBNF定义如下:1 program-declarations stmt-sequence2 declarations- decl ; declarations |3 decl- type-specifier varlist4 type-specifier- int | bool | char5

6、varlist- identifier , identifier 6 stmt-sequence- statement ; statement 7 statement- if-stmt | repeat-stmt | assign-stmt | read-stmt | write-stmt | while-stmt8 while-stmt - while bool-exp do stmt-sequence end9 if-stmt- if bool-exp then stmt-sequence else stmt-sequence end10 repeat-stmt- repeat stmt-

7、sequence until bool-exp11 assign-stmt- identifier:=exp12 read-stmt- read identifier13 write-stmt- write exp14 exp- arithmetic-exp | bool-exp | string-exp15 arithmetic-exp- term addop term 16 addop- + | -17 term- factor mulop factor 18 mulop- * | /19 factor- (arithmetic-exp) | number | identifier20 b

8、ool-exp- bterm or bterm 21 bterm- bfactor and bfactor22 bfactor- comparison-exp23 comparison-exp - arithmetic-exp comparison-op arithmetic-exp24 comparison-op- | = | string 2.3 TINY+的语义定义l 一个用TINY+语言编写的程序包括变量的声明和语句序列两个部分。变量声明部分可以为空,但一个TINY+程序至少要包含一条语句。l 所有的变量在使用之前必须声明,并且每个变量只能被声明一次。l 变量以及表达式的类型可以是整型

9、int,布尔类型bool或者字符串类型char,必须对变量的使用和表达式进行类型检查。2.4 用TINY+语言编写的示例程序char str;int x, fact;str:= sample program in TINY+ language- computes factorial ;read x;if x0 and x100 then dont compute if x0 dofact:=fact*x;x:=x-1end;write factend3 实验1:实现TINY+语言的词法分析器3.1 实验目的学生在该实验中构造TINY+语言的词法分析程序。具体要求如下:1 词法分析器的输入是源程

10、序文件,输出是单词(token)流。2 构造的词法分析器必须遵循最长子串原则,例如字符串:= 应该被识别为一个代表赋值符号的单词,而不是识别为两个单词:和 =。3 词法分析器识别出的单词应该被表示成二元组的形式(Kind, Value),其中Kind表示单词的种类,Value表示单词的实际值。要求用如下符号表示不同种类的单词:KEY 表示关键字;SYM 表示特殊符号;ID 表示标识符;NUM 表述数字常量STR 表示字符串常量4 词法分析器的任务除了完成对单词的识别之外,还要检查程序中的词法错误,给出错误的信息以及错误在源程序中出现的位置(所在的行号)。词法错误的种类包括: 非法符号,词法分析

11、器可能识别到一个TINY+程序的字母表中不允许的符号,例如,词法分析器在一个源程序中识别到$,应报告一个词法错误,发现了一个非法符号; 字符串类型的单词STRING,单引号不匹配。例如,源程序中出现 scanner,词法分析分析器应报告错误“字符串缺少右引号”; 注释的括号不匹配。例如源程序中出现this is an example,词法分析器应报告错误“注释缺少右括号”。3.2 实验要求1 用C语言或C+语言构造词法分析器2 实验学时为4学时。学生必须提交实验报告和词法分析器程序的源代码。3.3 TINY+的测试程序及词法分析器的输出Test1orandintboolcharwhiledoi

12、fthenelseendrepeatuntilreadwrite=a2c123EFG 词法分析器应产生如下输出:(KEY, or)(KEY, and)(KEY, int)(KEY, bool)(KEY, char)(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, )(S

13、YM, =)(ID, a2c)(NUM, 123)(STR, EFG)Test2this is an exampleint A,B;bool C1, C2, C3;char D;D:= scanner;while A=B do A:=A*2 end词法分析器应产生如下输出:(KEY, int)(ID, A)(SYM, ,)(ID, B)(SYM, ;) (KEY, bool)(ID, C1)(SYM, ,)(ID, C2)(SYM, ,)(ID, C3)(SYM, ;)(KEY, char)(ID, D)(SYM, ;)(ID, D)(SYM, :=)(STR, scanner)(SYM, ;

14、)(KEY, while)(ID, A)(SYM, =)(ID, B) (KEY, do)(ID, A)(SYM, :=)(ID, A)(SYM, *)(NUM, 2)(KEY, end)4 实验2:实现TINY+的语法分析器、语义分析器以及中间代码生成器4.1 实验目的学生在该实验中构造TINY+语言的语法分析器、语义分析器以及中间代码生成器,具体要求如下:1 为TINY+构造一个递归下降语法分析器。该语法分析器对词法分析器生成的单词序列进行语法分析,产生一颗抽象语法树作为语法分析器的输出。2 构造TINY+的语义分析器,该语义分析器构建符号表,然后检查程序中的语义错误。3 构造TINY+的

15、中间代码生成系,该中间代码生成器将TINY+程序翻译为三地址中间代码。 4 要求能检查程序中语法和语义错误,具体包括:a) 语法错误: 语法结构的开始符号以及跟随符号错误; 标识符错误,例如在程序的变量声明中,关键字int 后没有跟随标识符; 括号不匹配的错误,例如左括号(和右括号 )不匹配。 符号错误,例如赋值语句中要求使用的正确符号是:=,而在关系比较表达式要求使用的正确符号是=。 b) 语义错误: 一个标识符没有声明就使用,以及一个标识符被声明不止一次。 一个条件表达式的类型不是布尔类型bool。 一个二元操作符的两个操作数的类型不相等。 赋值语句左右部的类型不相等。4.2 实验要求1

16、用C语言或C+语言实现2 实验学时为12学时。学生必须提交实验报告和程序源代码。4.3 TINY+示例程序及其输出Test1int A,B,C,D; while AD do if A=1 then A:= B*C+37 else repeat A:=A*2until A+C=B+D endend实验应产生如下输出:说明:假定stmt-sequence.next=L0,即假定L0是和语句序列stmt-sequence(语法树的树根)的代码结束后要执行的第一条三地址指令对应标号。1) Label L12) if AD goto L26) goto L07) Label L28) if A=1 go

17、to L49) goto L510) Label L411) t1:=B*C12) t2:=t1+3713) A:=t214) goto L115) Label L516) Label L617) t3:=A*218) A:=t319) t4:=A+C20) t5:=B+D21) if t40 and x100 then dont compute if x0dofact:=fact*x;x:=x-1end;write factend实验应产生如下输出:1) read x;2) Label L13) if x0 goto L34) goto L05) Label L36) if x0 goto

18、L713) goto L514) label L715) t1:=fact*x16) fact:=t117) Label L818) t2:=x-119) x:=t220) goto L621)Label L522) write fact23) Label L0附录:和TINY+文法规则对应的生成三地址中间代码的属性文法1 Seq-S ; Seq1S.next=newlabel;Seq1.next=Seq.next;Seq.code=S.code | Label S.next | Seq1.code2 Seq-SS.next=Seq.next;Seq.code=S.code3 S-repeat

19、 Seq until ES.begin =newlabel;Seq.next=newlabel;E.true=S.next;E.false=S.begin;S.code=Label S.begin | Seq.code | Label Seq.next | E.code4 S-while E do Seq endS.begin=newlabelSeq.next=S.beginE.true=newlabelE.false=S.nextS.code=Label S.begin | E.code | Label E.true | Seq.code | goto S.begin 5 S-if E then Seq endE.true=newlabel;E.false=S.next;Seq.next=S.nextS.code=E.code | Label.E.ture | Seq.code6 S-if E then Seq1 else Seq2 endE.ture=newlabel;E.false=newlabel;Seq1.next=S.next;Seq2.next=S.next;S.code=E.code | Label E.true | Seq1.code |goto S.next | Label E.fasle | Seq2.code

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 高中资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁