《编译原理》课程
实验报告(临时)
题目                     
专业                     
班级                     
学号                     
姓名                      
指导教师                   
华东理工大学软件与管理信息学院
源程序是指什么程序2006年9月22日
一.实验题目
二.实验成员
组长名字写在第一个,每个同学完成的基本任务是什么。
三.实验内容
本学期的编译实验内容是使用编译构造工具实现一个扩充PL0语言的编译器。
扩充PL0语言是在PL0语言的基础上增加对整型一维数组的支持、扩充IF-THEN-ELSE条件语句、增加REPEAT语句、支持带参数的过程和增加注释,如下所示:
(1)整型一维数组,数组的定义格式为:
VAR <数组标识名>(<下界>:<上界>)
其中上界和下界可以是整数或者常量标识名。
访问数组元素的时候,数组下标是整型的表达式,包括整数、常量或者变量和它们的组合。例如,假设a是常量,b是整型变量,c是数组,这些访问方式都应该可以使用:c(1),c(a),c(b),c(b+c(1))。
    (2)扩充条件语句,格式为:
        <条件语句>::= IF <条件>THEN <语句>[ELSE <语句>]
    (3)增加REPEAT语句,格式为:
        <重复语句> ::= REPEAT <语句> UNTIL <条件>
    (4) 支持带参数(传值参数)的过程,定义和调用形式如下:
<过程首部>::= PROCEDURE <标识符> [‘(’<形式参数>{, <形式参数>}‘)’] ;
<过程调用语句>     ::= CALL  <标识符>[‘(’<传值参数> {,<传值参数> }‘)’]   
(5) 注释
        单行注释以 { 开始,以 } 结束,注释内容不包括 {和 }.
完整的扩充PL0语言的EBNF范式见实验提供的文档所示。下文所说的PL0语言,如果不加说明,就是特指扩充PL0语言。
本实验实现的PL0语言编译器,输入是PL0源语言程序,输出是一个栈式机的汇编语言(PCODE)程序,然后解释执行。如图1所示。

    PL0语言编译器的设计实现过程分两个阶段:
1. 词法分析和语法分析,即PL0p1
2. 语义分析和代码生成,即PL0p2。
这两部分的顺序如图2所示,具体的实验要求描述见后面。
汇编代码(PCODE)
解释器(根据需要修改)
语义分析和代码生成(PL0p2)
词法分析(PL0p1)
图1.2    编译程序的流程
PL0源程序
1. 词法分析和语法分析(PL0p1)
PL0p1的输入是PL0源程序,语法分析程序在分析过程中先调用词法分析程序,然后判断是否合法的PL0程序,输出结果是接受或者拒绝。首先扫描PL0源语言程序,从而识别出标识符、保留字、整数等符号,并返回类别码信息。这一部分的重点是掌握词法分析程序生成器flex的用法。接着在词法分析的基础上进行语法分析,重点是掌握语法分析程序生成器bison的用法。主要任务是把PL0的EBNF文法写成bison可识别的格式。程序最终能识别出符合语法规则的PL0程序,并对不符合语法规则的PL0程序报错。
2. 语义分析和代码生成(PL0p2)
功能是在语法分析程序中添加语义分析功能,审查程序是否有语义错误,并为被识别的语句生成相应的汇编代码,实验中采用的汇编代码是PCODE。
为了支持带参数的过程和一维数组,可能需要增加新的指令,但是由于对实现方法没有严格要求,需要大家自己思考并实现自己的设计。并且在实验报告中写出自己的实现方法来。
四.实验要求
1. 实验环境要求
实验的运行环境是Windows操作系统下的Visual C++ 6.0,编程语言是C或者C++,使用flex(是一种用来生成代码扫描器的工具和bison(际上是使用最广泛的Yacc-like分析器生成器,使用它可以生成解释器,编译器,协议实现等多种程序)。实验提供的文件:
PL0语言的EBNF描述。
一些PL0程序例子。
Lex和YACC的源程序框架
2. 提交实验
PL0实验需要提交所有的源程序文件和VC6工程文件,包括词法文件(pl0.l)和语法文件(pl0.y)。注意必须提交工程文件。提交的工程应能用VC6打开。
请大家按照如下目录结构整理自己的程序和文档:
实验报告统一交给科代表。每一组上交时,建立一个第几组的文件夹,然后把所有上交的资料都放在里面。文件夹中应当有一个文档readme(在文档中请写明每个同学的姓名、班级、学号、Email、电话号码等个人信息,以便遇到问题时老师可以及时与你联系)。
此外,文档中还要写明程序实现的功能,主要数据结构的设计,重要算法的流程,以及实验中遇到的问题和解决方法。如果对实验做了扩展,在文档还要详细说明扩展实现的功能及实现方法。
    Base目录中应当包含实现了基本要求的程序代码。其中的Source子目录中是程序代码,这个目录中应包括程序运行需要的所有文件(包括那些不需要你修改的文件)。Test目录中应包括我们给出的所有测试文件及其标准输出。无论你是否对程序进行扩展,这个目录的内容都是必须要有的。
    Extension目录是可选的。如果你对程序进行了扩展,请将扩展版本的源代码和测试文件放在这个目录中。其中的Source子目录中是扩展后的程序代码。Test子目录中是你针对扩展部分提供的测试文件及相应的输出。此外,还请提供一个测试文档test,说明你的扩展能够处理的输入,以便老师在测试时设计相应的测试文件。
3. 评分标准
实验部分在总成绩中占10%。PL0p1和PL0P2各占5%。PL0P1评分的主要标准,主要看功能是否完全,能否正确编译PL0程序。PL0p2的评分主要标准,是通过对一些PL0程序的编译,看程序运行结果是否合法。
4. 其它
(1) 关于扩展
我们会给出一些可选的扩展建议,大家可以根据自己的兴趣和精力选做其中的内容。同时,我们也非常欢迎大家自己设计一些扩展的功能并编程实现。扩展部分在整个实验完成后酌情统一加分。
对扩展的要求是,在实验报告中明确指出做了什么扩展,同时写出扩展的实现方法,包括可能的对词法、语法(例如,增加或者改变了原来的语法定义)、语义分析和代码生成的(例如,增加了新的指令)做的改变和扩展,并且给出测试样例。测试样例要求能够测试扩展的正确性,以及可能的出错检查。
因为每个人做的扩展都不同,并却扩展可能会使针对基本要求的测试样例无效,所以要求大家基本要求和扩展分成两个工程做,提交的时候同时提交两者,基本要求和扩展放在不同的目录。
(2)本课程考试:平时成绩+上机考试+笔试。
平时成绩(考勤+平时作业+期中考试+实验报告)占30%,上机考试占10%,考试占60%。一次点名不到扣3分(包括迟到、早退、没有请假条的),三次不到平时成绩为0。平时作业为每章课后习题。实验报告由两个人或者三个人一组,自由组合,选择一个组长,然后分工,分别注明每个人做了什么事,事情基本上要平分。全班可能30个组,抽取10个组答辩,如果能回答上,就给分,回答不上,不给分。期末考试前(17周前),交实验报告,然后组织答辩。注意:上机时间,不准玩游戏和网络聊天,发现一次扣3分。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。