编译原理综合实验指导书
编译原理实验指导书
编译原理实验指导书《编译原理》实验指导书太原科技大学计算机学院 -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 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 软件实验室规则及安全守则见《软件实验室规则及安全守则》)。
编译原理实验指导书(-).docx
编译原理实验指导书合肥学院计算编译原理实验指导书实验一词法分析一、实验目的:通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。
并掌握在对程序设计语言源程序进行扫描过程屮将其分解为各类单词的词法分析方法。
编制一个读单词过程,从输入的源程序中,识別出各个具有独立意义的单词, 即基木保留字、标识符、常数、运算符、分隔符五大类。
并依次输出各个单词的内部编码及单词符号自身值。
(遇到错误时可显示“Error”,然后跳过错误部分继续显示)二、实验预习提示1、词法分析器的功能和输出格式词法分析器的功能是输入源程序,输出单词符号。
词法分析器的单词符号常常农示成以下的二元式(单词种别码,单词符号的属性值)。
本实验中,采用的是一类符号一种别码的方式。
2、单词的BNF表示<标识符> -V字母〉v字母数字串〉V字母数字串一V字母〉V字母数字串>|v数字〉V字母数字串〉Iv下划线>v字母数字串I e<无符号整数一V数字〉v数字串〉V数字串〉一V数字〉V数字串〉v加法运算符>-+<减法运算符〉->・V大于关系运算符>->>V大于等于关系运算符>-> =3、“超前搜索”方法词法分析时,常常会用到超前搜索方法。
如当前待分析字符串为“”,当前字符为此时,分析器倒底是将其分析为犬于关系运算符还是犬于等于关系运算符呢?显然,只有知道下一个字符是什么才能下结论。
超前读了一个字符所以要回退一个字符,词法分析器才能正常运行。
在分析标识符,无符号整数等时也有类似情况。
4、模块结构Y饗冲区扫播一个辛閒N ▼三、实验过程和指导:(-)准备:1・阅读课木有关章节,明确语言的语法,写出基木保留字、标识符、常'数、运算符、分隔符和程序例。
2 .初步编制好程序。
3•准备好多组测试数据。
(二)上课上机: 将源代码拷贝到机上调试,发现错误,再修改完善。
第二次上机调试通过。
(三)程序要求:程序输入/输出示例:如源程序为C语言。
输入如卜•一段:main(){int a,b;a = 1 0;b = a 4- 20;}要求输出如下图。
《编译原理》实验指导书
编译原理实验报告班级:计134班姓名:***学号:******实验一词法分析程序设计与实现一、实验目的通过编写和调试一个词法分析程序,掌握在对程序设计语言的源程序进行扫描的过程中,将字符流形式的源程序转化为一个由各类单词序列的词法分析方法。
二、基本实验内容与要求假定一种高级程序设计语言中的单词主要包括五个关键字begin、end、if、then、else;标识符;无符号常数;六种关系运算符;一个赋值符和四个算术运算符,试构造能识别这些单词的词法分析程序(各类单词的分类码可参见表1)。
输入:由符合和不符合所规定的单词类别结构的各类单词组成的源程序文件。
输出:把所识别出的每一单词均按形如(CLASS,V ALUE)的二元式形式输出,并将结果放到某个文件中。
对于标识符和无符号常数,CLASS字段为相应的类别码的助记符;V ALUE字段则是该标识符、常数的具体值;对于关键字和运算符,采用一词一类的编码形式,仅需在二元式的CLASS字段上放置相应单词的类别码的助记符,V ALUE字段则为“空”。
表1 语言中的各类单词符号及其分类码表要求:1、上机前完成词法分析程序的程序流图,并选择好相应的数据结构。
2、用于测试扫描器的实例源文件中至少应包含两行以上的源代码。
3、对于输入的测试用例的源程序文件,词法正确的单词分析结果在输出文件中以二元式形式输出,错误的字符串给出错误提示信息。
例如,若输入文件中的内容为:“if myid>=1.5E−2+100 then x:=y”,则输出文件中的内容应为:(IF,)(ID,’myid’)(GE,)(UCON,0.015)(PL,)(UCON,100)(THEN,)(ID,’x’)(IS,)(ID,’y’)三、实现方法1、一般实现方法说明词法分析是编译程序的第一个处理阶段,可以通过两种途径来构造词法分析程序。
其一是根据对语言中各类单词的某种描述或定义(如BNF),用手工的方式(例如可用C语言)构造词法分析程序。
实验指导书编译原理
编译原理实验教学指导书计算机科学与工程学院华南理工大学目录1 实验简介 (3)2 TINY+语言介绍 (4)2.1 TINY+语言的词法定义 (4)2.2 TINY+的语法定义 (5)2.3 TINY+的语义定义 (7)2.4 用TINY+语言编写的示例程序 (7)3 实验1:实现TINY+语言的词法分析器 (9)3.1 实验目的 (9)3.2 实验要求 (10)3.3 TINY+的测试程序及词法分析器的输出 (10)4 实验2:实现TINY+的语法分析器、语义分析器以及中间代码生成器 (13)4.1 实验目的 (13)4.2 实验要求 (14)4.3 TINY+示例程序及其输出 (14)附录:和TINY+文法规则对应的生成三地址中间代码的属性文法 (16)1 实验简介学生在实验中,构造一个将TINY+高级程序设计语言转换为TINY+虚拟机上的中间代码的编译器。
整个实验包括两个部分:实验一完成TINY+编译器的词法分析器部分;实验二完成TINY+编译器的语法分析器部分、语义分析器部分及中间代码生成器部分。
每个同学必须独立完成自己的实验,与其他同学的讨论或合作是允许的,但必须是有限度的,可以互相交流想法和方法,但不能抄袭。
学术不端将导致成绩为零。
TINY+的编译器必须用C语言或C++语言实现(推荐使用Microsoft Visual Studio)。
2 TINY+语言介绍实验定义了一种叫TINY+的高级程序设计语言,该语言是对TINY 语言的一个扩充,TINY+比TINY增加了程序的声明部分,while语句,字符串类型定义等等,在本节的描述中,用蓝色字体标识的是TINY语言原有的词法及语法规定,而用红色字体标识的是TINY+语言扩充的词法及语法规定。
本节主要是对TINY+语言的介绍,具体包括:1)TINY+语言的词法定义,包括对TINY+语言的单词(token)的描述;2)TINY+语言语法结构的EBNF描述;3)TINY+语言主要的语义描述;4)TINY+的实例程序2.1 TINY+语言的词法定义1.TINY+语言的关键字(keyword)包括:or and int bool char while doif then else end repeat until read write所有的关键字是程序设计语言保留使用的,并且用小写字母表示,用户自己定义的标识符不能和关键字重复。
《编译原理实验》实验指导书
广州大学实验课程建设项目《编译原理实验》实验指导书广州大学信息与机电工程学院计算机系2006年10月目录实验1 Pascal 语言的编译器的使用 3 实验2 词法分析(一) 13 (调试一个词法分析程序)实验3 词法分析(二) 16 (设计、编制并调试一个词法分析程序)实验4 语法分析(一) 19 (调试一个语法分析程序,了解编译程序中LR分析表的作用)实验5 语法分析(二) 22(设计、编制并调试一个语法分析程序)实验6 语义分析 24实验7 编译原理综合实验 26 实验报告示例:词法分析程序 47考试考核方式 53实验一:Pascal 语言的编译器的使用实验目的:调试一个Pascal 语言的编译器,加深对语言编译器的理解实验内容:此程序为Pascal 语言的编译器,支持Proc ,Repeat,If,While,For,Fun函数结构代码的编译,能生成变量表、常量表和汇编程序。
界面如下:图1 Pascal 语言的编译器的使用界面下面给出软件所能编译的代码和编译出的结果。
―――――――――――――――――――――――――――――――――――Proc函数结构代码:vara, b, i: integer;procedure p1(arg1: integer; arg2: integer);begina := arg1 * arg2;end;beginb := 123;p1(3, b);――――――――――――――――――――――――――――――――――-编译状态下:变量[0]str = unsigned[参], OffPos = 0[1]a = unsigned[静], OffPos = 0[2]b = unsigned[静], OffPos = 0[3]i = unsigned[静], OffPos = 0[4]arg1 = unsigned[参], OffPos = 0[5]arg2 = unsigned[参], OffPos = 1常量[0]Number = 123[静], OffPos = 0[1]Number = 3[静], OffPos = 0方法ID = 1, Name = p1, MethodType = 过程, ParamList = (4, 5), DynaV arList = (), Addr = 2 ++++++++++++++++++++++++++++++++++++运行状态下:变量[0]str = unsigned[参], OffPos = 0[1]a = 369[静], OffPos = 0[2]b = 123[静], OffPos = 0[3]i = unsigned[静], OffPos = 0[4]arg1 = unsigned[参], OffPos = 0[5]arg2 = unsigned[参], OffPos = 1汇编语句:0:Goto 0, 71:Return 0, 02:Mov 0, 43:Mov 0, 54:Mul 0, 05:Sto 1, 16:Return 0, 07:LoadConst 0, 08:Sto 0, 29:LoadConst 0, 110:Mov 0, 211:Call 0, 1 ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――For结构代码:vara, b, i: integer;a := 0;for i := 0 to 100 dobegina := a + i;end;end;――――――――――――――――――――――――――――――――――-编译状态下:变量[0]str = unsigned[参], OffPos = 0[1]a = unsigned[静], OffPos = 0[2]b = unsigned[静], OffPos = 0[3]i = unsigned[静], OffPos = 0常量[0]Number = 0[静], OffPos = 0[1]Number = 0[静], OffPos = 0[2]Number = 100[静], OffPos = 0方法ID = 0, Name = ShowMessage, MethodType = 过程, ParamList = (0), DynaV arList = (), Addr = 1++++++++++++++++++++++++++++++++++++运行状态下:变量[0]str = unsigned[参], OffPos = 0[1]a = 5050[静], OffPos = 0[2]b = unsigned[静], OffPos = 0[3]i = 101[静], OffPos = 0汇编语句:0:Goto 0, 21:Return 0, 02:LoadConst 0, 03:Sto 0, 14:LoadConst 0, 15:Sto 0, 36:LoadConst 0, 27:Mov 0, 38:>=? 0, 09:IfFalseGoto 0, 1810:Mov 0, 111:Mov 0, 312:Add 0, 013:Sto 0, 114:Mov 0, 315:IncV ar 0, 116:Sto 0, 317:Goto 0, 6 ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――While函数结构代码:vara, i: integer;begini := 0;a := 0;while i <= 100 dobegina := a +i;i := i +1;end;end;――――――――――――――――――――――――――――――――――-编译状态下:变量[0]str = unsigned[参], OffPos = 0[1]a = unsigned[静], OffPos = 0[2]i = unsigned[静], OffPos = 0常量[0]Number = 0[静], OffPos = 0[1]Number = 0[静], OffPos = 0[2]Number = 100[静], OffPos = 0[3]Number = 1[静], OffPos = 0方法ID = 0, Name = ShowMessage, MethodType = 过程, ParamList = (0), DynaV arList = (), Addr = 1++++++++++++++++++++++++++++++++++++运行状态下:变量[0]str = unsigned[参], OffPos = 0[1]a = 5050[静], OffPos = 0[2]i = 101[静], OffPos = 0汇编语句:0:Goto 0, 21:Return 0, 02:LoadConst 0, 03:Sto 0, 24:LoadConst 0, 15:Sto 0, 16:Mov 0, 27:LoadConst 0, 28:<=? 0, 09:IfFalseGoto 0, 1910:Mov 0, 111:Mov 0, 212:Add 0, 013:Sto 0, 114:Mov 0, 215:LoadConst 0, 316:Add 0, 017:Sto 0, 218:Goto 0, 6 ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――Repeat函数结构代码:vara, i: integer;begina := 0;i := 0;repeata := a + i;i := i + 1;until i > 100;end; ――――――――――――――――――――――――――――――――――-编译状态下:变量[0]str = unsigned[参], OffPos = 0[1]a = unsigned[静], OffPos = 0[2]i = unsigned[静], OffPos = 0常量[0]Number = 0[静], OffPos = 0[1]Number = 0[静], OffPos = 0[2]Number = 1[静], OffPos = 0[3]Number = 100[静], OffPos = 0方法ID = 0, Name = ShowMessage, MethodType = 过程, ParamList = (0), DynaV arList = (), Addr = 1++++++++++++++++++++++++++++++++++++运行状态下:变量[0]str = unsigned[参], OffPos = 0[1]a = 5050[静], OffPos = 0[2]i = 101[静], OffPos = 0汇编语句:0:Goto 0, 21:Return 0, 02:LoadConst 0, 03:Sto 0, 14:LoadConst 0, 15:Sto 0, 26:Mov 0, 17:Mov 0, 28:Add 0, 09:Sto 0, 110:Mov 0, 211:LoadConst 0, 212:Add 0, 013:Sto 0, 214:Mov 0, 215:LoadConst 0, 316:>? 0, 017:IfFalseGoto 0, 6 ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――Fun函数结构代码:vara, i: integer;function fun1(arg1, arg2: integer): integer;beginResult := arg1 + arg2;end;begina := 0;for i := 1 to 100 dobegina := fun1(a, i);end;end;――――――――――――――――――――――――――――――――――-编译状态下:变量[0]str = unsigned[参], OffPos = 0[1]a = unsigned[静], OffPos = 0[2]i = unsigned[静], OffPos = 0[3]arg1 = unsigned[参], OffPos = 0[4]arg2 = unsigned[参], OffPos = 1[5]Result = unsigned[动], OffPos = 2常量[0]Number = 0[静], OffPos = 0[1]Number = 1[静], OffPos = 0[2]Number = 100[静], OffPos = 0方法ID = 1, Name = fun1, MethodType = 函数, ParamList = (3, 4), DynaV arList = (5), Addr = 2 ++++++++++++++++++++++++++++++++++++运行状态下:变量[0]str = unsigned[参], OffPos = 0[1]a = 5050[静], OffPos = 0[2]i = 101[静], OffPos = 0[3]arg1 = unsigned[参], OffPos = 0[4]arg2 = unsigned[参], OffPos = 1[5]Result = unsigned[动], OffPos = 2汇编语句:0:Goto 0, 71:Return 0, 02:Mov 0, 33:Mov 0, 44:Add 0, 05:Sto 0, 56:Return 0, 07:LoadConst 0, 08:Sto 0, 19:LoadConst 0, 110:Sto 0, 211:LoadConst 0, 212:Mov 0, 213:>=? 0, 014:IfFalseGoto 0, 2315:Mov 0, 116:Mov 0, 217:Call 0, 118:Sto 0, 119:Mov 0, 220:IncV ar 0, 121:Sto 0, 222:Goto 0, 11 ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――If 结构代码:vara, i: integer;begina := 2;if a = 1 thenbegini := 10;endelse begini := 100;end;end;――――――――――――――――――――――――――――――――――-编译状态下:变量[0]str = unsigned[参], OffPos = 0[1]a = unsigned[静], OffPos = 0[2]i = unsigned[静], OffPos = 0常量[0]Number = 2[静], OffPos = 0[1]Number = 1[静], OffPos = 0[2]Number = 10[静], OffPos = 0[3]Number = 100[静], OffPos = 0方法ID = 0, Name = ShowMessage, MethodType = 过程, ParamList = (0), DynaV arList = (), Addr = 1 ++++++++++++++++++++++++++++++++++++运行状态下:变量[0]str = unsigned[参], OffPos = 0[1]a = 2[静], OffPos = 0[2]i = 100[静], OffPos = 0汇编语句:0:Goto 0, 21:Return 0, 02:LoadConst 0, 03:Sto 0, 14:Mov 0, 15:LoadConst 0, 16:=? 0, 07:IfFalseGoto 0, 118:LoadConst 0, 29:Sto 0, 210:Goto 0, 1311:LoadConst 0, 312:Sto 0, 2 ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――递归结构代码:vara, b: integer;function f1(arg: integer): integer;beginif arg <= 1 thenbeginResult := 1;endelse beginResult := arg * f1(arg - 1);end;end;begina := 10;b := f1(a);ShowMessage(b);end; ――――――――――――――――――――――――――――――――――-编译状态下:变量[0]str = unsigned[参], OffPos = 0[1]a = unsigned[静], OffPos = 0[2]b = unsigned[静], OffPos = 0[3]arg = unsigned[参], OffPos = 0[4]Result = unsigned[动], OffPos = 1常量[0]Number = 1[静], OffPos = 0[1]Number = 1[静], OffPos = 0[2]Number = 1[静], OffPos = 0[3]Number = 10[静], OffPos = 0方法ID = 1, Name = f1, MethodType = 函数, ParamList = (3), DynaV arList = (4), Addr = 2 ++++++++++++++++++++++++++++++++++++运行状态下:变量:无汇编语句:Goto 0, 171:Return 0, 02:Mov 0, 33:LoadConst 0, 04:<=? 0, 05:IfFalseGoto 0, 96:LoadConst 0, 17:Sto 0, 48:Goto 0, 169:Mov 0, 310:Mov 0, 311:LoadConst 0, 212:Sub 0, 013:Call 0, 114:Mul 0, 015:Sto 0, 416:Return 0, 017:LoadConst 0, 318:Sto 0, 119:Mov 0, 120:Call 0, 121:Sto 0, 222:Mov 0, 223:Call 0, 0 ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――实验二:词法分析(一)实验目的:调试一个词法分析程序,加深对词法分析原理的理解实验内容:(1)设一小型编译程序关于高级语言有如下的规定:高级语言程序具有四种基本结构:顺序结构﹑选择结构﹑循环结构和过程。
福建工程学院《编译原理实验指导》
编译原理实验指导书指导老师:职称:目录编译原理课程实验指导 (1)实验一源程序预处理 (2)实验二简单程序设计语言的词法分析器 (6)实验三递归下降分析法 (9)实验四预测分析法 (9)实验五LR语法分析 (13)编译原理课程实验指导一、课程实验方案1 实验教学目标与基本要求(1)通过实习具有开发基本的词法分析和语法分析算法的能力。
(2)了解词法分析和语法分析的工作原理和特点(3)掌握课本所介绍的编译算法的原理和实现2 实验环境介绍实验主要以程序设计实现各种教学课堂中讲过的图形算法为主。
程序设计设计语言主要以Visual C++语言为实验平台。
3 课程实验内容实验一源程序预处理实验学时:2学时实验目的:熟悉源程序预处理的任务和要求。
实现源程序输入串中注释、续行符的删除,换行符和Tab的替换,大小写字母变换,得到预处理后的文本串,为单词识别做好准备。
实验内容:1.删除注释2.删除续行符以及后续换行符3.将换行符和TAB统一替换为空格4.将大写字母变换为小写字母,或者相反,以实现不区分大小写5.识别标号区,识别续行标志。
实验步骤:(1)熟悉教材关于词法分析中预处理的原理。
(2)依照教材关于源程序预处理的算法,使用C/C++语言或其它语言实现该算法。
(3)调试、编译、运行程序。
实验要求:在下次实验时提交本次实验的实验报告(实验报告包括实验目的、实验内容、实验实现过程、源程序、实验结果、实验体会)。
实现代码:#include<fstream.h>#include<iostream.h># include<conio.h>void pro_process(char *);void main( ){//定义扫描缓冲区char buf[4048]={'\0'}; //缓冲区清0//调用预处理程序pro_process(buf);//在屏幕上显示扫描缓冲区的内容cout<<buf<<endl;}void pro_process(char *buf){ifstream cinf("source.txt",ios::in);int i=0; //计数器char old_c='\0',cur_c; //前一个字符,当前字符bool in_comment=false; //false表示当前字符未处于注释中while(cinf.read(&cur_c,sizeof(char))) //从文件读一个字符{switch(in_comment){case false:if(old_c=='/' && cur_c=='*') //进入注释{ i--; //去除已存入扫描缓冲区的字符’/’in_comment=true;}else {if(old_c=='\\' && cur_c=='\n') //发现续行i--; //去除已存入扫描缓冲区的字符’\’else {if(cur_c>='A' && cur_c<='Z') //大写变小写cur_c+=32;if(cur_c=='\t' || cur_c=='\n') //空格取代tab换行cur_c+=' ';buf[i++]=cur_c;}}break;case true:if(old_c=='*' && cur_c=='/') //离开注释in_comment=false;}//end of switchold_c=cur_c; //保留前一个字符}//end of whilebuf[i++]='#'; //在源程序词尾加字符# }实验二简单程序设计语言的词法分析器实验学时:2学时实验目的:掌握词法分析器的原理将源程序预处理、状态图转换等结合,建立简单的程序设计语言词法分析器实验内容:要求能对简单程序设计语言进行词法分析,具体内容如下:字符集{…a‟..‟z‟, …0‟..‟9‟,‟+‟,‟=‟,‟*‟,‟,‟,‟;‟,‟(…,‟)‟,‟#‟}若发现字符集之外的字符,即为非法字符,当出现非法字符时终止词法分析器的运行。
编译原理综合指导书.docx
编译原理综合实验指导书序言《编译原理综合实验》作为《编译原理》课程的延伸,其目的是让同学动手设计和实现某一规模适屮的语言的编译器,该编译器不仅涉及编译程序前端设计的各个阶段,而口也强调了编译的总体设计、各个阶段的接口安排等等。
通过上机实践,來设计这个相对完整的编译器设计,一方面可以使学生增加对编译程序的整体认识和了解——巩固《编译原理》课程所学知识,另一方面,通过上机练习,学生也可以学到很多程序调试技巧和设计大型程序一般的原则,如模块接口的协调,数据结构的合理选择等等。
一.上机实践要求(1)本次实验要求单人独立完成,综合实验提交的截止日期是第18周周五;(2)本次综合实验须经授课教师当面验收考核后才予评分,否则以缺交处理;实验验收地点:1号学院楼121实验验收时间:笫14周-笫18周,每周一、三、四、五下午12:00-2:00 (3)综合实验分为四个部分,即:词法分析器设计、语法分析器设计、语义分析器设计、屮间代码生成。
每实现一个部分可得到不同的分数,满分为100分。
具体评分标准如下:①词法分析器源代码+实验报告10分②语法分析器源代码+实验报告40分③语义分析器源代码+实验报告10分④中间代码生成源代码实验报告40分注: 以上各部分评分中,代码实现占80%,实验报告占20%;综合实验的成绩占总成绩的15%o(4)实验结束后提交:源代码和实验报告。
(5)实验报告内容:①冇关编译器设计的说明。
详细说明你的编译器的实现原理,包括软件结构设计说明、功能模块说明、关键数据结构说明、关键算法实现等、②指出你的程序屮最精彩的部分,以及你的设计小述存在的问题不足。
③总结开发经验收获;④如果重做一遍,你会有哪些新的改进?⑤测试源代码。
注:实验报告中不要贴代码,否则一律视作灌水贴。
(6)附加题:(1)语法分析能支持错误处理;说明:根据实现难度相应加分,最高20分。
(2)扩展文法屮的“条件表达式”文法,使其能如C语言那样支持带括号的布尔运算和逻辑运算,而且生成的布尔表达式采用短路计算。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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;}。