编译原理综合实验指导书

合集下载

编译原理实验指导书

编译原理实验指导书

编译原理实验指导书《编译原理》实验指导书太原科技大学计算机学院 -3-1序《编译原理》是国内外各高等院校计算机科学技术类专业,特别是计算机软件专业的一门重要专业课程。

该课程系统地向学生介绍编译程序的结构、工作流程及编译程序各组成部分的设计原理和实现技术。

由于该课程理论性和实践性都比较强,内容较为抽象复杂,涉及到大量的软件设计和算法,因此,一直是一门比较难学的课程。

为了使学生更好地理解和掌握编译原理和技术的基本概念、基本原理和实现方法,实践环节非常重要,只有经过上机进行程序设计,才能使学生对比较抽象的教学内容产生具体的感性认识,增强学生综合分析问题、解决问题的能力,并对提高学生软件设计水平大有益处。

为了配合《编译原理》课程的教学,考虑到本课程的内容和特点,本指导书设置了七个综合性实验,分别侧重于词法分析、NFA的确定化、非递归预测分析、算符优先分析器的构造、LR分析、语义分析和中间代码的生成、基于DAG的基本块优化,以支持编译程序的各个阶段,基本涵盖了《编译原理》课程的主要内容。

本指导书可作为《编译原理》课程的实验或课程设计内容,在课程教学的同时,安排学生进行相关的实验。

实验平台可选择在MS-DOS或Windows操作系统环境,使用C/C++的任何版本作为开发工具。

学生在做完试验后,应认真撰写实验报告,内容应包括实验名称、实验目的、实验要求、实验内容、测试或运行结果等。

目录实验一词法分析 ........................................................... 错误!未定义书签。

实验二 NFA的确定化.................................................... 错误!未定义书签。

实验三非递归预测分析 ............................................... 错误!未定义书签。

编译原理实验指导书

编译原理实验指导书

编译原理实验指导书计算机学院实验1 词法分析程序一、实验目的构造simple语言的词法分析程序,程序要求能对输入的字符串流进行词法分析。

在实验的过程中,学会应用单词分析的方法——NFA(非确定有穷自动机)和DFA(确定有穷自动机),加深对词法分析原理的理解。

二、实验内容编写为任一正则文法(见实验参考(一)simple惯用的词法)构造非确定有穷自动机NFA并转换成确定有穷自动机DFA,并对任给的一个输入串(见实验参考(二)测试用输入串)进行词法分析的程序,程序的输出为单词的序列(见实验参考(三)程序输出形式)。

三、实验参考(一)simple 惯用的词法1. 下面是语言的关键字:Begin if then while do end所有的关键字都是保留字,并且必须是小写。

2. 下面是专用符号::= + * / < <= <> > >= = ; ( ) #3. 其他单词是标识符(ID)和整型常数(NUM),通过下列正规式定义:ID = letter(letter| digit)*NUM = digit digit*letter = a |…| z | A |…| Zdigit = 0 |…| 9小写和大写字母是有区别的。

思考:构造实数的正规表达式,力争实现对实数的识别及表示。

4. 空格由空白、换行符和制表符组成。

空格一般用来分隔ID、NUM、运算符和关键字,词法分析阶段通常被忽略。

5. 各种单词符号对应的种别码如下表所示:(二)词法分析程序的功能1. 输入为所给文法的源程序字符串。

2. 程序的输出形式为单词串的输出形式。

所输出的每一单词,均按形如(syn,token和sum)的二元式编码。

其中,syn 为单词种别码;token为存放的单词自身字符串;sum为整型常数。

3.测试源程序片断:begin x:=9; if x>0 then x:=2*x+1/3;end #。

编译原理实验指导书

编译原理实验指导书

编译原理实验指导书第1节概述1、本课程实践的目的和任务编译原理是一门实践性很强的课程,只有通过实践,才能真正掌握。

实际的编译程序是十分复杂的,有时由多达十几万条指令组成。

为此,编译原理的实践教学,采用简化编译过程的办法,选择最关键的3个环节──词法分析、语法分析(包括语义处理、产生无优化的目标指令)、连接调试,进行编程和调试训练。

每个环节作为一个实践课题。

2、实践方法任何一个实用的高级语言,其语法都比较复杂,如选其作为源语言,很难实践全过程。

故本实践将定义一个简化的语言──PASCAL语言的一个子集作为源语言,也可以自行定义一个简单的C语言子集,在3个题目中选择两个题目,也可以自行选择与编译技术相关的实验题目,设计调试出它的编译程序。

前后贯穿这一条主线进行实践。

每次都可利用课余时间编程,利用上机时间进行输入和调试。

建议使用C或C++或JAVA语言。

3、实践报告的规范和要求每个课题完成后写出实践报告。

实践报告包括程序设计时考虑的算法和方法;调试过程中出现的问题和解决的措施;提交电子版的程序清单和调试时所用的源程序。

4、简化的PASCAL语言子集的定义〈PASCAL子集程序〉→〈变量说明〉〈分程序〉。

〈变量说明〉→〈空〉|VAR〈变量表〉:INTEGER;〈变量表〉→〈变量〉|〈变量〉,〈变量表〉〈变量〉→〈标识符〉〈分程序〉→BEGIN〈语句组〉END〈语句组〉→〈语句〉|〈语句〉;〈语句组〉〈语句〉→〈赋值语句〉|〈条件语句〉|〈WHILE语句〉|〈分程序〉〈赋值语句〉→〈变量〉:=〈算术表达式〉〈条件语句〉→IF〈布尔表达式〉THEN〈语句〉ELSE〈语句〉〈WHILE语句〉→WHILE〈布尔表达式〉DO〈语句〉〈算术表达式〉→〈项〉|〈算术表达式〉+〈项〉|〈算术表达式〉-〈项〉〈项〉→〈初等量〉|〈项〉*〈初等量〉|〈项〉/〈初等量〉〈初等量〉→〈无符号数〉|〈变量〉|(〈算术表达式〉)〈关系表达式〉→〈算术表达式〉〈关系运算符〉〈算术表达式〉〈标识符〉→〈字母〉|〈标识符〉〈字母〉|〈标识符〉〈数字〉〈无符号数〉→〈数字〉|〈无符号数〉〈数字〉〈关系运算符〉→〈|〈=| =| 〉=| 〉|〈〉〈字母〉→ A│B│C│D│E│F│G│H│I│J│K│L│M│N│O│P│Q│R│S│T││U│V│W│X│Y│Z〈数字〉→ 1│2│3│4│5│6│7│8│9│0第2节词法分析本节进行词法分析程序的编程与调试。

编译原理综合实验指导书

编译原理综合实验指导书

编译原理综合实验指导书序言《编译原理综合实验》作为《编译原理》课程的延伸,其目的是让同学动手设计和实现一个简单语言的编译器和解释器。

通过上机实践,来设计这个相对完整的编译器设计,一方面可以使学生增加对编译程序的整体认识和了解——巩固《编译原理》课程所学知识,另一方面,通过上机练习,学生也可以学到很多程序调试技巧和设计大型程序一般的原则,如模块接口的协调,数据结构的合理选择等等。

一、上机实践要求(1)综合实验的成绩占总成绩的30%;(2)本次实验的所有代码都需要自行编码实现,不能用lex、yacc、JavaCC 等软件自动生成;(3)本次实验要求单人独立完成,综合实验提交的截止日期是2016-6-20;(4)本次综合实验须经授课教师当面验收考核后才予评分,否则以缺交处理;(5)实验结束后提交:源代码和实验报告。

实验报告的格式参见“实验报告模板”。

注:实验报告中不要贴代码。

二、实验内容:(一)词法分析程序的设计与实现:20分要求:设计一个词法分析程序,每调用一次就从源程序文件中顺序识别出一个单词符号。

单词种类与识别规则○1标识符:首字符为字母或’#’,其后由字母、数字或’#’组成;○2整数:由一个或多个数字组成、带正负号的数字串,首位数字不能为0;○3小数:[+|-] 正整数1 ·正整数2[+|-]:表示可选的+或-注意:正整数1不能为空,正整数2可以为空,例如:23.○4字符串:由一对双引号括起来的文本注意:字符串不需要支持多行,即假定任意一串字符串都不能超过一行;字符串不需要支持转义符。

○5保留字:class、if、then、else、call、while、do、string、integer、float、○6单目运算符:+-* / = < >○7双目运算符:<= >= <> ==⑧布尔运算符:&& ||⑨界符:( ) { } ,;此外,该词法分析程序还要能支持单行注释和多行注释(注释语法同C语言)。

编译原理compiler-实验-指导书

编译原理compiler-实验-指导书

编译原理compiler-实验-指导书编译原理实验指导书课程名称 : 编译原理英文名称 : Compiler Principle 课程性质 : 必修编写人: 编译原理课程组2013年9月1日计算机学院1. 阅读说明基础实验?、选做实验?、实验中的附加内容★未加标注的实验为参考实验2. 实验要求从以下方案中选一方案A (成绩上限:120%)-完成1个基础实验?: 90%-完成选做实验?或实验中的附加内容★: 30%方案B (成绩上限:150%)-完成综合实验3.1: 150%3. 成绩评定成绩评定依据原创性、工作量(自己编写的代码部分才能得分,参考的部分不得分)代码质量、丰富的测试用例、功能和实现上的独立思考与创新实验验收顺序、主动性评分标准源码、验收、答辩(90%)实验报告、作品及文档提交(10%)4. 验收流程必须携带打印版实验报告进行验收,验收顺序依据实验报告提交的顺序验收分―申优验收‖和―抽查‖两种形式,参加―申优验收‖才能获得B(百分制85%)以上的成绩。

必须当面验收的实验 - 选做内容、选做实验、综合实验5. 设计文档要求设计文档参照模板书写。

所有实验必须提交设计文档的打印版本(A4)6. 作品提交要求参加―申优验收‖的同学需提交作品的电子文档及源码,否则,只需提交打印版实验报告。

将作品打包成 .rar文件发送至指定电子邮箱邮箱地址: ytuCompiler@/doc/d506f661102de2bd960588 c4.html请大家参考以下目录命名与结构提交实验所有文档及源码COMPILER_班级_学号_姓名_本次实验名称(根目录)├ bin 存放可执行程序├ config 存放各种配置文件├ lib 存放类库文件├ doc 存放设计文档及readme.txt├ src 存放源程序及项目工程文件├ test 存放测试程序├ references存放参考文档、代码、其他资源根目录命名举例:COMPILER_0813_200825501101_张三_实验1.1若发现程序或文档雷同,按作弊处理完全雷同,取消参加期末考试资格,本学期理课程总评成绩为0分。

编译原理实验指导书

编译原理实验指导书

《编译原理》实验指导书别小川于枫编写适用专业:计算机科学与应用江苏科技大学电子信息学院2005年2月前言《编译原理》是计算机专业的一门核心课程,在计算机本科教学中占有十分重要的地位。

由于《编译原理》课程兼有很强的理论性和实践性,并且编译程序构造的算法比较复杂,因而让学生在学习时普遍感到内容抽象、不易理解,难易掌握。

但是掌握编译原理的基本理论和设计思想是非常重要的,尤其是将本课程的理论知识与计算机应用中的许多领域紧密联系与广泛应用结合。

将有利于学生提高专业素质和适应社会多方面需要的能力。

因此,通过理论授课和上机实践,使学生对编译的基本概念、原理和方法有完整的和清楚的理解,并能正确地、熟练地加以运用。

通过实验逐步提高学生的编程能力和调试程序的能力以及解决实际问题的能力。

使学生培养出扎实的软件开发基本技能,并养成良好的编程风格,为进一步学习后续课程和将来从事应用软件开发奠定良好的基础。

实验课时具体内容安排如下:一、实验课的性质和目的(1)深刻理解程序语言编译系统的结构及各部分的功能。

(2)熟练掌握设计和构造程序语言编译系统的基本原理和技术。

(3)能独立编写清晰、工整、结论正确的编译原理的源程序。

(4)能学会上机进行正确调试,并进行程序修改。

即培养发现程序错误,排除错误的能力和经验。

二、实验课的基本要求:(1)掌握编译程序的功能和结构。

(2)掌握词法分析器的设计方法与实现步骤加深对讲授内容的理解,尤其是一些语法给定,通过上机实验帮助掌握。

(3)掌握语法分析器的设计方法与实现步骤。

(4)掌握符号表和存储空间的组织。

(5)掌握代码优化的作用与实现方法(6)掌握错误的诊断和校正方法。

三、主要实验教学方法实验前,由任课教师落实实验任务,每个学生必须事先独立完成好程序的设计的源程序编写工作。

实验课上对疑难点作集中辅导。

实验过程中随时针对不同的情况作个别启发式辅导。

实验后,学生撰写并提交实验报告。

最后,由实验教师根据每个学生的编程、上机调试能力、编程能力和实验结果及实验报告综合评定学生的实验成绩。

《编译原理》实验指导书

《编译原理》实验指导书

《编译原理》实验指导书目录编译原理一共开设了三个实验,它们是:1.词法分析程序,占2个学时2.语法分析程序,占2个学时3.扩充的PL/0分析程序(综合实验),占6个学时。

实验报告格式1.姓名班级学号2.实验名称3.实验目的4.实验要求5.实验内容(这个是实验报告的主要部分)6.实验总结(实验心得)7. 实验报告人报告时间实验一 PL/O语言的词法分析程序GETSYM过程GETSYM的说明:由于一个单词往往是由一个或几个字符组成,所以在词法分析过程GETSYM中又定义一个取字符过程GETCH,由词法分析需要取字符时调用。

实验目的:1.为了更好的配合《编译原理》有关词法分析章节的教学2.加深和巩固学生对于词法分析的了解和掌握3.让学生初步的认识PL/0语言的基础和简单的程序编写4.学生通过本实验能够初步的了解和掌握程序词法分析的整个过程5.提高学生的上机和编程过程中处理具体问题的能力实验要求:1.做本实验之前要先阅读完总体的预备知识以及本实验相关的基础知识2.实验要求自己独立的完成,不允许抄袭别人的实验结果3.编写和调试过程中出现的问题最好做一下记录4.实验程序调试完成后,用给定的PL0测试程序(test.pl0)进行测试,由老师检查测试结果,并给予相应的成绩5.实验完成后,要上交实验报告。

实验内容:1.阅读所给出的词法分析程序(pl0_lexical.c),搞懂程序中每一个变量的含义,以及每一个过程的作用,并在该过程中进行中文注释。

2.阅读完程序后,画出各过程的流程图。

3.给出的程序包含两处输入错误,利用所给的pl/0源程序(test.pl0)对程序进行调试,使其能正确对所给文件进行分析并能够解释运行。

4.在阅读懂所给出的词法分析程序后,将你对词法分析的理解写在实验报告上。

实验环境:1.操作系统为Windows 2000或Dos6.2以上2.应用软件为Pascal或C语言GETCH 所用单元说明:CH :存放当前读取的字符,初值为空,LINE:为一维数组,其数组元素是字符;界对为1:80。

《编译原理》实验指导书(程细柱)

《编译原理》实验指导书(程细柱)

前言“编译原理”课程是计算机本科专业的必选课程,上机实验是该课程的重要环节,应开实验数约为12学时。

一个编译程序把源程序翻译成等价的目标程序,一般应做词法分析、语法分析、语义分析、代码生成和代码优化等五个方面的工作,为了使学生对其有较深的理解,必须根据这五个方面设计实验。

本指导书正是根据课程的内容,将实验分为前期准备阶段、基本操作阶段和技术提高阶段三个阶段进行:①前期准备阶段的实验主要是为后续实验做好准备,应围绕编译原理课程进行设计,如:学生可根据教科书的内容,设计一个源程序的输入和扫描程序,并完成相应的设计报告;②基本操作阶段的实验是围绕着编译原理的五个方面的工作来进行,其内容主要是词法分析、语法分析、语义分析、代码生成和代码优化等,如:简单的词法分析程序、LL(1) 分析法算法、语义分析程序、中间代码和目标代码生成算法的实验,这些实验基本上包括了以上知识要点,学生可结合书本上有关的知识来完成;③技术提高阶段的实验是综合性课程设计实验,根据编译原理编制应用程序,不仅要求把书本上的内容掌握好,同时还需要自学一些相关的知识。

1目录第1章实验的一般知识 (3)1—1 软件实验室规则及安全守则 (3)1-2 实验条件 (3)1—3 实验的基本要求 (3)第2章实验技术及原理 (3)第3章实验项目 (4)实验一:源程序的输入和扫描(2学时) (4)实验二:词法分析算法(2学时) (6)实验三:LL(1) 分析算法(2学时) (8)实验四:语义分析算法(2学时) (11)实验五:中间代码生成算法(2学时) (14)实验六:目标代码生成算法(4学时) (14)实验七:“编译原理”课程设计(8学时) (14)附录:实验报告示例:有限自动机的运行实验 (16)参考文献:《编译原理》吕映芝、张素琴、蒋维杜等主编清华大学出版社《编译原理与实现》..金成植编高教出版社《编译程序设计原理》..杜淑敏王永宁编北大出版社2第1章实验的一般知识1—1 软件实验室规则及安全守则见《软件实验室规则及安全守则》)。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

编译原理综合实验指导书序言《编译原理综合实验》作为《编译原理》课程的延伸,其目的是让同学动手设计和实现一个简单语言的编译器和解释器。

通过上机实践,来设计这个相对完整的编译器设计,一方面可以使学生增加对编译程序的整体认识和了解——巩固《编译原理》课程所学知识,另一方面,通过上机练习,学生也可以学到很多程序调试技巧和设计大型程序一般的原则,如模块接口的协调,数据结构的合理选择等等。

一、上机实践要求(1)综合实验的成绩占总成绩的30%;(2)本次实验的所有代码都需要自行编码实现,不能用lex、yacc、JavaCC 等软件自动生成;(3)本次实验要求单人独立完成,综合实验提交的截止日期是2016-6-20;(4)本次综合实验须经授课教师当面验收考核后才予评分,否则以缺交处理;(5)实验结束后提交:源代码和实验报告。

实验报告的格式参见“实验报告模板”。

注:实验报告中不要贴代码。

二、实验内容:(一)词法分析程序的设计与实现:20分要求:设计一个词法分析程序,每调用一次就从源程序文件中顺序识别出一个单词符号。

单词种类与识别规则○1标识符:首字符为字母或’#’,其后由字母、数字或’#’组成;○2整数:由一个或多个数字组成、带正负号的数字串,首位数字不能为0;○3小数:[+|-] 正整数1 ·正整数2[+|-]:表示可选的+或-注意:正整数1不能为空,正整数2可以为空,例如:23.○4字符串:由一对双引号括起来的文本注意:字符串不需要支持多行,即假定任意一串字符串都不能超过一行;字符串不需要支持转义符。

○5保留字:class、if、then、else、call、while、do、string、integer、float、○6单目运算符:+-* / = < >○7双目运算符:<= >= <> ==⑧布尔运算符:&& ||⑨界符:( ) { } ,;此外,该词法分析程序还要能支持单行注释和多行注释(注释语法同C语言)。

(二)语法分析程序的设计与实现:30分要求:构造下列文法的语法分析程序,应能指出源程序中首次出现的错误及出错位置。

1.<程序>—> <类> [<类>]2.<类>—> class id { [<属性>|<方法>]}3.<属性>—> <变量定义语句>4.<方法>—> <数据类型> id(<参数列表>) <语句块>5.<参数列表>—> <数据类型> id[,<数据类型> id]|ε6.<语句块>—> {[<语句>]}7.<语句>—> <分支语句>| <赋值语句>| <循环语句>| <函数调用语句>| <变量定义语句>| <语句块>|ε8.<变量定义语句>—> <数据类型> id[, id] ;9.<数据类型>—> integer |float |string|class id10.<赋值语句>—> id = <表达式> ;11.<函数调用语句>—> call id ( <传递参数>) ;12.<传递参数>—> id[, id]| ε13.<分支语句>—> if <布尔表达式> then <语句>|if <布尔表达式> then <语句> else <语句>14.<循环语句>—> while <布尔表达式> do <语句>15.<表达式>—> <项> [ +|- <项> ]16.<项>—> <因子> [ *|/ <因子> ]17.<因子>—> id |con | deci |( <表达式> )14. <布尔表达式>—> <关系表达式> [ && ||| <布尔表达式> ]15. <关系表达式>—> <表达式> <关系> <表达式>16. <关系>—> < |<= |> |>= |== |<>说明:(1) id是标识符;con是整数常量;deci是小数常量;(2) 用左右尖括号<>括起来的是非终结符;(3) 红色方括号[ ]相当于正则表达式中的()*,表示其中内容重复0次或N多次;(4) 文法中用蓝色标注的都是终结符(即单词);(5) 文法中&&与||不存在优先级,两者优先级别一样,按左结合处理。

1、基原理:递归下降法是语法分析中最易懂的一种方法。

它的主要原理是,对每个非终极符按其产生式结构构造相应语法分析子程序,其中终极符产生匹配命令,而非终极符则产生过程调用命令。

因为文法递归相应子程序也递归,所以称这种方法为递归子程序下降法或递归下降法。

其中子程序的结构与产生式结构几乎是一致的。

注意:每次进入子程序之前都预先读入下一个要分析的单词(而且是由调用程序完成的,切忌在进入子程序后才读入下一个单词,虽然这样语法效果是相当的,但运行时会出错的)。

因为使用了递归下降方法,所以程序结构和层次清晰明了,易于手工实现,且时空效率较高。

实际的语法分析工作,从调用总程序的分析子程序开始,根据产生式进行递归调用各个分析子程序。

(三)类型检查程序的设计与实现:20分要求:(1)检查变量的定义和使用是否正确:变量是否重复定义、变量是否未定义就使用;(2)过程的名称是否重复定义;(3)过程的实参与形参的数目是否一致;(4)过程的实参与形参的数据类型是否一致。

设计指导:如何利用符号表进行语义检查。

符号表在编译的过程中起着非常重要的作用,它一方面可以帮助语义分析程序进行语义检查,一方面可以辅助代码生成程序生成正确的代码(请参见书本相关章节)。

符号表是记录符号属性的表,它的每一表项表示一个标识符的属性信息。

这些属性信息通常包括种类(常数、变量、数组、标号等),类型(整型、实型、逻辑型、字符型等),给名字分配的存储单元地址等。

符号表中的各类信息将在编译程序工作过程中的适当时候填入。

对在语义分析阶段建造符号表的编译程序,当遇到标识符声明部分时,每当遇到一个名字声明,就以此名字查符号表;若表中无此登记项,则将该名字填入表中;若该表中已有此登记项,则说明该名字是重复声明,报告语义错误。

至于与该名字相关的一些信息,可视工作的方便,分别在编译程序工作过程中的适当时候填入:种类,类型等信息可在语义分析阶段完成;名字的存储地址等信息则要在代码生成阶段完成。

几乎在编译程序工作的全部过程中,都需要对符号表进行频繁的访问,查表和填表等操作,是编译程序的一笔很大的开销。

因此,合理地组织符号表,并相应地选择好查表和填表的方法,是提高编译程序工作效率的重要一环。

(四)四元式翻译程序的设计与实现:30分要求:将语法和语义都正确的源程序翻译成四元式。

设计参考:在<IF语句>语法分析程序的基础上添加语义翻译子程序和中间代码生成部分代码的方法。

<if语句> ::= if <布尔表达式> then <执行句> else <执行句>ST_SORT(token); /*处理各种可执行语句*/ST_SORT(chart *token) /* 可执行语句分类处理模块主程序*/{if (token = "if") ifs(); /*调用IF语句分析模块*/else if (token= "while") whiles();/*调用while语句分析模块*/else if (token= "repeat") repeats();/*调用repeat语句分析模块*/else if (token= "for") fors();/*调用for语句分析模块*/else assign();/*其余情况表示是赋值语句,直接调用赋值语句的分析*/}编写一个函数gencode, 该函数在四元式表中加入新的四元式四元式的格式为:(op, arg1,arg2,result)。

要先定义一个四元式表intertable,结构如下:其中nxq函数描述如下:void gencode(char *op,char *arg1,char *arg2,char *result)/*生成新的四元式,加入表尾*/{strcpy(intertable[nxq].op,op);strcpy(intertable[nxq].arg1,arg1);strcpy(intertable[nxq].arg2,arg2);strcpy(intertable[nxq].result,result);nxq = nxq +1;}。

相关文档
最新文档