《编译原理》实验指导及报告书(新)课件
- 格式:doc
- 大小:155.00 KB
- 文档页数:23
陕西理工学院数学与计算机科学学院《编译原理》实验指导班级网络10级指导教师曹阳计算机工程教研室2012年8月25日编译原理实验指导书一、实验的目的《编译原理》是针对计算机专业的学生开设的一门专业基础课程,对引导学生进行科学思维和提高学生解决实际问题的能力有重要的作用。
开设“编译原理实验”的主要目的是让学生加深理解编译原理的基本理论、方法、词法分析、语法分析、中间代码的生成直到最后的代码生成,了解编译器原理,从而提高学生分析问、题解决问题的能力。
通过实验实现以下基本目标:1.深化已学的知识,完成从理论到实践的转化通过实验,进一步加深对编译原理基本思想、原理的了解。
2. 提高分析和解决实际问题的能力实验不仅是编译原理的一次模拟训练,同时通过实验,积累经验,提高分析和解决问题的能力。
3.培养“开拓创新”能力大力提倡和鼓励在程序中使用新方法,新技术。
激发学生实践的积极性与创造性,开拓思路,设计新算法,进行新创意,培养创造性能力。
二、参加实验的学生应具备的条件参加实验的学生应当具备计算机程序设计的一些基础的知识。
即学生应当熟练掌握和使用一种计算机操作系统(windows操作系统等)、一种程序设计语言(vb、vc、c、delphi等)。
三、实验要求实验的要求体现于整个工作的各个阶段中,可根据所选课题的特点而有所侧重,但应达到如下的基本要求:(1) 根据课题任务制定合理、可行的工作计划任务;(2) 制定适当的技术方案;(3) 学生在老师的指导下独立完成设计过程;(4) 撰写实验报告(包括实验内容中各个阶段所要求的文字材料);(5) 通过实验检查评定;四、实验项目与内容提要五、实验课程考核办法1、该实验课程考核成绩按百分制计算,满分为100分,60分为及格,60分以上者可获取该学分。
2、该实验课考核由三部分组成:实验课前预习(20%),实验操作(60%),实验报告(20%)。
3、各部分成绩由实验指导教师在每个实验项目完成后分别给出,在学期结束后或完成全部实验项目后综合给出该门实验课的成绩。
实验一无符号数的有穷自动机的实现(一)实验目的无符号数的有穷自动机的实现目的是使学生掌握文法的形式描述,穷自动机的概念。
将文法转换成有穷自动机的方法,理解出错处理程序思想,如何用状态矩阵实现一个穷自动机的机内表示。
(二)实验内容1.无符号数的BNF描述(0)<无符号数> → d <余留无符号数> | . <十进制数> | e <指数部分>(1)<余留无符号数>→d <余留无符号数> | . <十进制数> | e <指数部分>|ε(2)<十进制小数> → d <余留十进制小数>(3)<余留十进制小数> e <指数部分> | d <余留十进制小数> | ε(4)<指数部分> → d <余留整指数> | + <整指数> | - <整指数>(5)<整指数> → d <余留整指数>(6)<余留整指数> → d <余留整指数> | ε2.将G[<无符号数>]文法转换成有穷自动机。
3.构造状态矩阵;将有穷自动机的状S1 S2 ……Sn及输入的字a1 a2 ……am 构成一个n*m的矩阵。
4.用状态矩阵设计出一个词法分析程序。
5.扫描无符号数,根据文法给出无符号数出错的位置。
(三)实验要求1.学生课前要认真阅读实验指导,理解实验内容与相关理论知识的关系,并完成预习报告2.用C语言或其它高级语言编写程序3.写出实验报告实验二语法制导把表达式翻译成逆波兰式(一)实验目的进一步掌握语法制导翻译的概念,理解中间语言,设计出错处理程序方法,掌握把表达式翻译成中间语言的算法。
(二)实验内容1.从左到右扫描中缀表达式,经语法分析找出中缀表达式出现的错误并给出错误的具体位置和类型。
《编译原理》实验指导书编著陈志刚中南大学信息科学与工程学院2006年11月第一部分词法分析(实验一必作)实验一词法分析程序设计与实现一、实验目的加深对词法分析器的工作过程的理解;加强对词法分析方法的掌握;能够采用一种编程语言实现简单的词法分析程序;能够使用自己编写的分析程序对简单的程序段进行词法分析。
二、实验内容自定义一种程序设计语言,或者选择已有的一种高级语言,编制它的词法分析程序。
词法分析程序的实现可以采用任何一种编程语言和编程工具。
从输入的源程序中,识别出各个具有独立意义的单词,即关键字、标识符、常数、运算符、界符。
并依次输出各个单词的内部编码及单词符号自身值。
(遇到错误时可显示“Error”,然后跳过错误部分继续显示)三、实验要求:1.对单词的构词规则有明确的定义;2.编写的分析程序能够正确识别源程序中的单词符号;3.识别出的单词以<种别码,值>的形式保存在符号表中,正确设计和维护符号表;4.对于源程序中的词法错误,能够做出简单的错误处理,给出简单的错误提示,保证顺利完成整个源程序的词法分析;四、实验步骤1.定义目标语言的可用符号表和构词规则;2.依次读入源程序符号,对源程序进行单词切分和识别,直到源程序结束;3.对正确的单词,按照它的种别以<种别码,值>的形式保存在符号表中;4.对不正确的单词,做出错误处理。
五、实验报告要求详细说明你的程序的设计思路和实现过程。
用有限自动机或者文法的形式对词法定义做出详细说明,说明词法分析程序的工作过程,说明错误处理的实现。
参考资料一、程序要求1、以下面一段程序为例main() {int a,b;a = 10;b = a + 20;}2、需要识别的词1.关键字:if、int、for、while、do、return、break、continue;单词种别码为1。
2.标识符;单词种别码为2。
3.常数为无符号整形数;单词种别码为3。
4.运算符包括:+、-、*、/、=、、<、=、<=、!= ;单词种别码为4。
编译原理实验指导书计算机科学与技术系2007年6月目录实验目的和任务 (1)实验一:词法分析器 (1)实验二:语法分析器1 (5)实验三:语法分析器2 (9)实验四:语义分析和中间代码生成器 (11)实验目的和任务编译原理是一门实践性很强的课程,只有通过实践,才能真正理解其理论的深层内涵,切实掌握编译器的生成技术。
实际的编译程序是十分复杂的,有时多达十几万条指令组成,实现起来难度很大。
在编译原理的实验中,简化了真实程序设计语言要面临的许多问题,选用了具有一定表现能力的实用语言的子集。
实验主要涉及最关键的3个环节──词法分析、语法分析和中间代码生成,每个环节既独立又相互关联,前后衔接,可合为一体,能较清楚地展现编译器前端的工作状况。
编程语言要求:C、C++或JAVA。
实验一:词法分析器一、实验目的通过编写词法分析程序,了解词法分析的过程。
二、实验内容编写能识别给定的程序设计语言的词法规则,输出单词流的识别程序。
三、实验设备及工具1.硬件:PC机Pentium100以上。
2.软件:Win2000或WinXP、BC++、VC++或JA V A开发环境。
四、实验说明以下所给文法是进行词法分析和语法分析的依据,并将该文法中涉及到的单词信息提取到了单词符号与种别对照表中。
本次实验要求编写符合该文法构词规则的词法分析器。
1. 文法G(<程序>)<程序>→BEGIN <语句表> END.<语句表>→<语句>|<语句>;<语句表><语句>→<赋值语句>︱<条件语句>︱<WHILE语句>︱<复合语句><赋值语句>→<变量>=<算术表达式><条件语句>→IF <关系表达式> THEN <语句> ELSE <语句><WHILE语句>→WHILE <关系表达式> DO <语句><复合语句>→BEGIN <语句表> END<算术表达式>→<项>|<算术表达式>+<项>|<算术表达式>-<项><项>→<变量>|<整数><关系表达式>→<算术表达式><关系运算符><算术表达式><关系运算符>→<︱= =︱><变量>→<标识符><标识符>→<标识符><字母>|<标识符><数字>|<字母><整数>→<数字>|<数字><整数><字母>→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<数字>→0|1|2|3|4|5|6|7|8|9注意阴影部分,其中<整数>和<标识符>被看作最小词法单位。
编译原理实验指导书(李宏芒)《编译原理》实验指导书李宏芒编写适用专业:计算机科学与技术合肥工业大学计算机与信息学院2012年 12 月前言《编译原理》是计算机专业的一门核心课程,在计算机本科教学中占有十分重要的地位。
由于《编译原理》课程兼有很强的理论性和实践性,并且编译程序构造的算法比较复杂,因而让学生在学习时普遍感到内容抽象、不易理解,难易掌握。
但是掌握编译原理的基本理论和设计思想是非常重要的,尤其是将本课程的理论知识与计算机应用中的许多领域紧密联系与广泛应用结合,将有利于提高学生专业素质和适应社会多方面需要的能力,因此,通过理论授课和上机实践相结合,使学生对编译的基本概念、原理和方法有完整的和清楚的理解,并能正确地、熟练地加以运用;通过实验逐步提高学生的编程能力和调试程序的能力以及解决实际问题的能力,使学生培养出扎实的软件开发基本技能,并养成良好的编程风格,为进一步学习后续课程和将来从事应用软件开发奠定良好的基础。
实验课时具体内容安排如下:一、实验课的性质和目的(1)深刻理解程序语言编译系统的结构及各部分的功能。
(2)熟练掌握设计和构造程序语言编译系统的基本原理和技术。
(3)能独立编写清晰、工整、结论正确的编译原理的源程序。
(4)能学会上机进行正确调试,并进行程序修改。
即培养发现程序错误,排除错误的能力和经验。
二、实验课的基本要求:(1)掌握编译程序的功能和结构。
(2)掌握词法分析器的设计方法与实现步骤加深对讲授内容的理解,尤其是一些语法给定,通过上机实验帮助掌握。
(3)掌握语法分析器的设计方法与实现步骤。
(4)掌握符号表和存储空间的组织。
(5)掌握代码优化的作用与实现方法(6)掌握错误的诊断和校正方法。
三、主要实验教学方法实验前,由任课教师落实实验任务,每个学生必须事先独立完成好程序的设计的源程序编写工作。
实验课上对疑难点作集中辅导。
实验过程中随时针对不同的情况作个别启发式辅导。
实验后,学生撰写并提交实验报告。
. . 编译原理 实验指导书
主编:徐静 李娜
信息与电气工程学院 2010年3月 编译原理实验指导书 1 概 述 一、本课程实验的目的和任务 编译原理是一门实践性很强的课程,只有通过实践,才能真正掌握。实际的编译程序是十分复杂的,有时由多达十几万条指令组成。为此,编译原理的实践教学,采用简化编译过程的办法,选择最关键的3个环节──词法分析、语法分析(包括语义处理、产生无优化的目标指令)、连接调试,进行编程和调试训练。每个环节作为一个实践课题。先分别编程调试,再连接在一起总调。
二、实验方法
任何一个实用的高级语言,其语法都比较复杂,如选其作为源语言,很难实践全过程。故本实验将定义一个简化的语言── C语言的一个子集作为源语言,设计调试出它的编译程序。前后贯穿这一条主线进行实践。每次都可利用课余时间编程,利用上机时间进行输入和调试。 三、实验报告的规范和要求
每个实验完成后写出实验报告。实验报告的内容包括如下内容: 一、 实验目的 二、 程序设计时采用的算法和方法 三、 输入的源程序 四、 词法分析程序清单和输出结果。 五、 心得体会 编译原理实验指导书
2 实验一 词法分析 一、实验目的: (1)通过设计编制调试一个具体的词法分析程序,理解词法分析在编译程序中的作用。 (2)加深对有穷自动机模型的理解。 (3)掌握词法分析程序的实现方法和技术。 (4)用C语言对一个简单语言的子集编制一个一遍扫描的程序,以加深对编译原理的理解,掌握编译程序的实现方法和技术。 编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。(遇到错误时可显示“Error”,然后跳过错误部分继续显示) 。 二、实验预习提示 1. 词法分析器的功能和输出格式 词法分析器的功能是输入源程序,输出单词符号。词法分析器的单词符号常常表示成以下的二元式(单词种别码,单词符号的属性值)。本实验中,采用的是一类符号一种别码的方式。 2. 单词的BNF表示 → →| | |ε → → |ε → + → - → > → >= 3. “超前搜索”方法 编译原理实验指导书 3 词法分析时,常常会用到超前搜索方法。如当前待分析字符串为“a>+”,当前字符为“ >”,此时,分析器到底是将其分析为大于关系运算符还是大于等于关系运算符呢?显然,只有知道下一个字符是什么才能下结论。于是分析器读入下一个字符“+”,这时可知应将“ >”解释为大于运算符。但此时,超前读了一个字符“+”,所以要回退一个字符,词法分析器才能正常运行。在分析标识符,无符号整数等时也有类似情况。 4. 模块结构
. . 编译原理 实验指导书
主编:徐静 李娜 编译原理实验指导书
1 信息与电气工程学院 2010年3月
概 述 一、本课程实验的目的和任务
编译原理是一门实践性很强的课程,只有通过实践,才能真正掌握。实际的编译程序是十分复杂的,有时由多达十几万条指令组成。为此,编译原理的实践教学,采用简化编译过程的办法,选择最关键的3个环节──词法分析、语法分析(包括语义处理、产生无优化的目标指令)、连接调试,进行编程和调试训练。每个环节作为一个实践课题。先分别编程调试,再连接在一起总调。
二、实验方法
任何一个实用的高级语言,其语法都比较复杂,如选其作为源语言,很难实践全过程。故本实验将定义一个简化的语言── C语言的一个子集作为源语言,设计调试出它的编译程序。前后贯穿这一条主线进行实践。每次都可利用课余时间编程,利用上机时间进行输入和调试。 三、实验报告的规范和要求
每个实验完成后写出实验报告。实验报告的内容包括如下内容: 一、 实验目的 二、 程序设计时采用的算法和方法 三、 输入的源程序 编译原理实验指导书 2 四、 词法分析程序清单和输出结果。 五、 心得体会
实验一 词法分析 一、实验目的: (1)通过设计编制调试一个具体的词法分析程序,理解词法分析在编译程序中的作用。 (2)加深对有穷自动机模型的理解。 (3)掌握词法分析程序的实现方法和技术。 (4)用C语言对一个简单语言的子集编制一个一遍扫描的程序,以加深对编译原理的理解,掌握编译程序的实现方法和技术。 编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。(遇到错误时可显示“Error”,然后跳过错误部分继续显示) 。 二、实验预习提示 1. 词法分析器的功能和输出格式 词法分析器的功能是输入源程序,输出单词符号。词法分析器的单词符号常常表示成以下的二元式(单词种别码,单词符号的属性值)。本实验中,采用的是一类符号一种别码的方式。 编译原理实验指导书 3 2. 单词的BNF表示 → →| | |ε → → |ε → + → - → > → >= 3. “超前搜索”方法 词法分析时,常常会用到超前搜索方法。如当前待分析字符串为“a>+”,当前字符为“ >”,此时,分析器到底是将其分析为大于关系运算符还是大于等于关系运算符呢?显然,只有知道下一个字符是什么才能下结论。于是分析器读入下一个字符“+”,这时可知应将“ >”解释为大于运算符。但此时,超前读了一个字符“+”,所以要回退一个字符,词法分析器才能正常运行。在分析标识符,无符号整数等时也有类似情况。 4. 模块结构 编译原理实验指导书
编译原理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分。
《编译原理》实验指导及报告书 / 学年 第 学期 姓 名:______________ 学 号:______________ 班 级:______________ 指导教师:______________
计算机科学与工程学院 2016 第 2 页 共23 页
编译原理 实验初步 一、实验目的 1、熟练掌握使用CODEBLOCK进行C程序编程,提高阅读程序与调试程序的能力。 2、掌握堆栈与队列的应用。 3、掌握C语言中对字符串处理的常见函数与方法。 4、熟悉编程规范,养成对重要的程序段进行必要的注释说明。
二、实验内容与步骤 1、下面的程序是对一个简单的算术表达式进行计算求值,并输出表达式的值与该表达式的后缀形式。该程序在求值与转换后缀形式时使用了2个堆栈和1个队列。请认真阅读程序和调试,并将程序补充完整。 #include #include #include #define ERROR 0 #define OK 1 #define STACK_INT_SIZE 10 /*存储空间初始分配量*/ #define Queue_Size 20 typedef int ElemType; /*定义元素的类型*/
typedef struct{ char Qdata[Queue_Size]; int front,rear; }SeqQueue;
typedef struct{ ElemType *base; ElemType *top; int stacksize; /*当前已分配的存储空间*/ }SqStack;
SqStack OPTR, OPND; SeqQueue SeQ;
char PreTab[7][7]={{'>','>','<','<','<','>','>'}, {'>','>','<','<','<','>','>'}, {'>','>','>','>','<','>','>'}, {'>','>','>','>','<','>','>'}, {'<','<','<','<','<','=','x'}, {'>','>','>','>','x','>','>'}, {'<','<','<','<','<','x','='} }; // 该矩阵中,X字符表示不存在优先关系,在分析过程查找到这个值,表示表达式有错。 第 3 页 共23 页
char *OpretorS="+-*/()#"; // 运算符集 char *Express="3*(7-2)-6*2"; // 初始化的表达式 // 注意本程序只分析1位整数的表达式的运算,所以输入的表达式要注意!! // 能力强的同学自己进行扩展:增加词法分析过程进行拼数。
int InitStack(SqStack *S); /*构造空栈*/ int push(SqStack *S,ElemType *e); /*入栈*/ int Pop(SqStack *S); /*出栈*/
void initQueue(SeqQueue *Q){/*队列初始化*/ Q->front=0; Q->rear=0; } int EnterQueue(SeqQueue *Q,char c){ /*入队*/ if (Q->rear==Queue_Size) { printf("\n队列满,无法入队!\n");return ERROR; } Q->Qdata[Q->rear]=c; Q->rear++; return OK; } int OutQueue(SeqQueue *Q,char *e){ /*出队*/ if(Q->front==Q->rear) { printf("\n队列空,无法出队!\n");return ERROR; } *e=Q->Qdata[Q->front++]; return OK; } int InitStack(SqStack *S){ S->base=(ElemType *)malloc(STACK_INT_SIZE *sizeof(ElemType)); if(!S->base) return ERROR; S->top=S->base; S->stacksize=STACK_INT_SIZE; return OK; }/*InitStack*/ int Push(SqStack *S,ElemType e){ if ((S->top-S->base)>STACK_INT_SIZE) return 0; *S->top=e; S->top++; return OK; } int Pop(SqStack *S){ int e; if (S->top==S->base ) return 0; 第 4 页 共23 页
S->top--; e=*S->top; return *S->top; }
//判定c是否运算符,若是运算符则返回该运算符在运算符集中的位置,这样就能扫描优先//关系表,确定相邻运算符之间的优先级 int IsOps(char c){ int i=0; char *p;
p=OpretorS; while( i<7 ) {if (*p++==c) break; i++; } return i; }
char Precede(char c1,char c2){ //返回c1与c2运算符的优先关系 int i,j; i=IsOps(c1); j=IsOps(c2); if ( PreTab[i][j]=='x' ) return 0; return PreTab[i][j]; } int Operate(int a,char TheOp,int b){ //进行TheOp计算 switch ( TheOp ){ case '+': return a+b; case '-': return a-b ; case '*': return a*b ; case '/': return a/b ; } return 0; }
int main(){ char *ScanChar; char c1,c; char TheOp; int b,a,digit;
InitStack(&OPTR); 第 5 页 共23 页
Push(&OPTR,'#'); InitStack(&OPND); initQueue(&SeQ); ScanChar=Express; c=*ScanChar; while(c!='#' || *OPTR.top!='#') { if (c==0) c='#'; if (IsOps(c)>=7) // 判定是否是运算符,若IsOps的值>=7,则c是操作数 {digit=c-'0'; // 将字符转换成相应的数值 Push(&OPND,digit); // 操作数入栈 EnterQueue(&SeQ,c); // 操作数入队 c=*++ScanChar ; } else { c1=*(OPTR.top-1); switch ( Precede (c1,c)) // 调用哪个函数 {case '<': Push(&OPTR,c); c=*++ScanChar; break; case '=': //脱括号 TheOp=Pop(&OPTR); if (c!=0 && c!='#') c=*++ScanChar; break; case '>': TheOp=Pop (&OPTR ); // 参与计算的运算符出栈 EnterQueue(&SeQ,TheOp); // 参与运算的运算符入队 b=Pop(&OPND); a=Pop(&OPND); Push(&OPND, Operate (a,TheOp,b)); break; default: printf("\n算术表达式错误!\n") ; return ERROR ; } } } printf("\n算术表达式:%s --->后缀表达式为:",Express); while(SeQ.rear- SeQ.front!=0 ) // 将队列输出即为表达式的后缀形式 { OutQueue(&SeQ,&c);printf("%c",c);} printf("\n其结果为:%d",Pop (& OPND )); // 输出表达式的值 return 0; } 第 6 页 共23 页
2、修改上面的程序:要求通过键盘输入表达式,运行程序并纪录运行过程和结果,至少处理3个不同的表达式。 第一次运行:
第二次运行: 第三次运行: 三、实验小结与体会
四、实验评分和标准 1、(程序功能)程序调通并能实现基本的功能 50分 2、(实验态度)事先准备充分,上机调试认真,程序功能完整 20分 3、(实验报告)实验分析和总结报告认真 30分
五、教师评语