《编译原理》实验指导书
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《编译原理》实验指导书
实验目的和内容
编译原理实验的目的是使学生将编译理论运用到实际当中,实现一个简单语言集的词法、语法和语义分析程序,验证实际编译系统的实现方法,并加深对编译技术的认识。
实验内容共需实现编译器的词法、语法和语义分析程序三个组成部分。要求学生必须完成每个实验的基本题目要求,有余力的同学可尝试实验的扩展要求部分。
实验报告
要求每人针对所完成的实验内容上交一份实验报告,其中主要包括三方面内容:1、实验设计:实验采用的实现方法和依据(如描述语言的文法及其机内表示,词分析
的单词分类码表、状态转换图或状态矩阵等,语法分析中用到的分析表或优先矩阵等,语法制导翻译中文法的拆分和语义动作的设计编写等);具体的设计结果(应包括整体设计思想和实现算法,程序结构的描述,各部分主要功能的说明,法以及所用数据结构的介绍等)。
2、程序代码:实验实现的源程序清单,要求符合一般的程序书写风格,有详细的注释。
3、实验结果分析:自行编写若干源程序作为测试用例,对所生成的编译程序进行测试
(编译程序的输入与输出以文件的形式给出);运行结果分析(至少包括一个正确和一个错误单词或语句的运行结果);以及改进设想等。
注意事项
1、电子版实验报告和源程序在最后一次机时后的一周内上交。(每个同学上交一个压
缩文件,其命名格式为“学号_姓名.rar”,内含实验报告和一个命名为“源程序”
的文件夹。注意提交的源程序应是经过调试、测试成功的较为通用的程序,并应有相应的注释、运行环境和使用方法简介。)
2、不接受不完整的实验报告和没有说明注释的源程序,或者说明与程序、运行结果不
符合的作业。
特别鼓励:扩展题目
1、为亲身经历一个小型编译器的开发全过程,触摸一下与实际编译器开发相关的工作,
大家可以自由组成3人左右的小组,推举组长,模拟一个团队分工协作开发大型软件的实战环境,融入软件工程的思想规范和一般理论方法,初步体验从系统分析设计、编码测试到交付维护的一个完整编译器软件的开发过程。要求组长为每个小组成员分配主要负责的任务,完成相应的分析设计员、程序员和测试员等角色的工作,并以小组为单位提交一份实验报告和源程序,在报告封面上写明每个同学主要完成和负责的部分。
2、以组为单位完成的实验内容至少必须整合词法、语法和语义三个部分的实验,对于
选定的适当规模的文法(如C语言的一个大小适宜的子集),进行系统的总体设计、功能分析、编码测试等工作。完成一个从对源程序的词法分析开始,到中间代码生成的完整的编译器前端的开发,使所涉及到的编译系统的各个组成模块有机地衔接在一起,提交一份完整的实验报告和源程序,并将以下几个方面描述清楚:
1)任务概述
2)系统的设计
3)系统实现(包括必要的框图,各.h和.c文件说明,所有函数功能的说明,数据结构、各种表格、变量等的说明,以及函数调用关系图等)
4)系统工作过程及运行说明(使用操作指南)
5)源程序清单(要求有详细注释)和实例程序运行结果
6)体会和讨论
3、实验题目
1)参考题目:在词法、语法和语义三个基本实验题目的基础上,完成以下扩展部分的要求:实验一:
(1)扩充关键字的数目、增加单词类别(如分界符、逻辑运算符等)、将常数分成字符串常量、整型常量和实型常量等;添加词法分析中单词出错的位置、加细错误类型的检查以
及删除注释部分等;并考虑如何在词法分析阶段建立变量名表和常数表,以备后续的编
译过程查询。
(2)选作:识别一个程序设计语言(如C语言)所有单词的词法分析程序设计。建议自学LEX系统。
实验二:
(1)完成以下文法G[<复合语句>]的两种典型的语法分析程序的设计与实现。
G[<复合语句>]:
<复合语句> → begin<语句表>end
<语句表> → <语句>|<语句>;<语句表>
<语句> → <赋值语句>
<赋值语句> → <变量>:=<算术表达式>
<算术表达式> → <项> | <算术表达式>+<项> | <算术表达式>-<项>
<项> → <因式> | <项>*<因式> | <项>/<因式>
<因式> → <变量> | <常数> | (<算术表达式>)
<变量> → <标识符>
<标识符> → <标识符> <字母> | <标识符> <数字> | <字母>
<常数> → <整数> | <浮点数>
<整数> → <数字> | <数字> <整数>
<浮点数> →• <整数> | <整数> • <整数>
<字母> → A|B|C|…|X|Y|Z|a|b|c|…|x|y|z
<数字> → 0|1|2|…|9
(2)在所给文法G[<复合语句>]的基础上,适当扩大分析对象,增加功能。如赋值语句的左部不再只局限于简单变量,还可以是下标变量等;右部的算术表达式中可以包括函数调
用、数组元素等。除赋值语句外,还可进一步选择高级语言的其它语法结构类型,如流
程控制语句、子程序结构语句、说明语句等。语法分析的结果以语法树的形式输出,并
显示分析过程的信息(如分析栈、符号栈、当前应被归约的最左子串、归约后所得的符
号等)。
(3)增强错误检查和处理能力。例如,当输入的源程序存在错误时,把所发现的每一处错误的性质(错误编码)和位置填入一张表中,以备以后输出之用;同时再跳过错误所在的
语法范畴(如单词、表达式、语句等),继续对输入串的后续部分进行编译。至于对错
误的具体处理措施应结合所采用的语法分析方法,以LR分析为例,可对LR分析表中