文档库 最新最全的文档下载
当前位置:文档库 › basic_project

basic_project

basic_project
basic_project

基础课程实践项目——PL/0编译器的熟悉与C0语言编译器的构造

张昱2013年秋

P1 预备阶段

1、实验环境熟悉

安装Linux,使用GCC来编译C程序,如PL/0编译器,并运行编译生成的可执行程序。

2、PL/0语言了解并确定与PL/0语言表达能力类似的C0语言

阅读pl0.zip中的doc/pl0.pdf和sample/tests.pl0,理解PL/0语言的特征;编译PL/0编译器,运行所生成的可执行的PL/0编译器并用它编译运行tests.pl0。

C0 语言只有整数类型,它是C语言的一个子集,其程序结构包含变量声明(PL/0中的常量定义用带赋值的变量声明来表示)、变量声明和无参函数声明(定义)。C0语言有赋值语句、条件语句、循环语句、函数调用语句、复合语句和空语句。

注意:C0语言没有PL/0语言所允许的嵌套定义的过程(即在一个过程体中定义另一个过程)。C0语言编写出的程序是一个合法的C程序,可以用GCC编译得到可执行程序并运行。

我们将在后面的课程实验中,要求大家写出C0语言的词法和语法定义,并构造C0的编译器。

3、编写C0程序

用C0语言编写与tests.pl0功能相同的tests.c,并用GCC编译并运行。

4、初步理解PL/0编译器的中间表示

对比pl0.zip中的sample/tests.pl0和sample/tests.res,尝试理解PL/0编译器所用的中间表示——一种栈机器代码(在doc/pl0.pdf的1.2节有简要介绍)。

P2 词法分析

1、理解PL/0编译器的词法分析过程

PL/0编译器的词法分析由src/pl0.c中的getsym( )函数来负责完成。

2、扩展PL/0的词法

扩展PL/0编译器以支持:1)由/*开始后跟0个或多个字符、再以*/结尾的多行注释;2)以0开头后跟0~7这8种数字组成的八进制数;3)以0x或0X开头后跟0~9、A~F、a~f 组成的十六进制数。

3、词法的形式描述

分别给出PL/0语言和C0语言所的词法规范(即用正规式描述语言中合法的单词)。

4、学习使用词法分析器的生成工具Flex

阅读Flex manual和一个简单的表达式语言的词法分析例子,了解Flex的输入词法规范文件的格式,以及Flex生成的词法分析器的接口形式和实现。你可以从flex-2.5.35.tar.gz 的examples目录下获得更多使用Flex的例子。

5、用Flex生成PL/0的词法分析器

用Flex生成PL/0的词法分析器getsym( ),修改PL/0编译器源代码src/pl0.c,使得PL/0编译器能调用Flex生成的词法分析器来进行词法分析。

注意:

1) 要求用宏和条件编译来控制词法分析器的选择,即编译器是调用原有pl0.c中的getsym( )还是调用Flex生成的词法分析器;

2)能快速编译和运行使用1)中任意一种方式(原有pl0.c中的getsym( )或Flex生成的词法分析器)构造的PL/0编译器。

6、P2提交的目录结构要求

按如下目录结构提交到学生自己的git库的master 分支(缺省的分支就是master):

P2

|----README 提交内容说明,包含如何编译运行所提交的内容等

|----src/ 存放源程序文件(*.h, *.c)和Makefile

|----doc /实验设计文档

|----bin / 帮助快速编译和运行实验内容的shell脚本文件

|----test /存放测试程序

P3 PL/0语言编译器的理解和C0语言的语法定义

1、识别PL/0编译器在词法分析阶段和语法分析阶段所处理的错误

根据pl0.pdf中第20~21页提供的错误编号及含义,要求:

1)推测分别在词法分析阶段和语法分析阶段识别处理的错误种类;

2)阅读PL/0编译器源代码,确认分别在词法分析阶段和语法分析阶段识别出的错误种类,编写相应的测试程序并按错误类别命名保存在提交的P3/test/pl0/error目录下;

3)针对2)中所确认的每一种错误,撰写电子文档(保存在提交的doc目录下)描述:该类错误发生的场景、该类错误发生后PL/0编译器的错误处理方法、你认为对这类错误的处理是否有更好的改进方案。

注意理解(可参阅旧版以PL0为基础的《编译原理实践教程》):

1)test( )函数的作用及它的三个参数的含义,能举例说明第二个参数带来的好处和引起的问题。

2)你阅读的PL/0编译器实现的语法和pl0.pdf所定义的语法是否完全一样,若不一样,请指出有区别的地方。

3)PL/0编译器是如何把出错信息和源程序中的出错位置对应起来的。

2、写出C0语言的语法规范

1)用教材中习题3.7所介绍的扩展方式来给出C0语言的文法,并写入C0语言的设计文档(保存在提交的P3/doc目录下)中。

2)阅读PL/0编译器,为PL/0写一个LL文法(按照PL/0编译器所实现的递归下降语法分析方式)。

3)结合上述为PL/0编写LL文法的作业,为C0语言编写一个对应的LL文法。

3、理解PL/0编译器的实现和语言特征,编写C0语言程序

1)编写至少5个强调不同语言特征PL/0测试程序,在程序中以注释的形式说明该程序所强调的语言特征;然后为所编写的PL/0测试程序,编写对应的C0测试程序。

要求:所编写的测试程序按照所使用的语言不同分别置于提交的P3/test/pl0和P3/test/c0目录下。

2)理解PL/0编译器中使用的符号表的组织结构(包含相关的全局变量table和函数position( )),说明标识符的插入、查找和删除方面的特点。

3)理解PL/0语言的中间代码生成:

A. 理解PL/0编译器中使用的中间表示(在pl0.pdf的1.2节、《编译原理实践教程》中

有简要介绍);

B. 理解PL/0编译器的代码生成函数gen( )的作用以及三个参数的含义,gen( )中所使用的全局变量cx、cxmax、code分别存储什么信息;

C. 总结各个文法结构对应的中间代码结构分别是什么,其中各文法结构对应的函数中使用的、与代码生成有关的全局变量dx、lev、levmax等分别存储什么信息;

大家需要注意理解PL/0编译器中对每一种语法结构的处理,以及这种语法结构对应到C0中的结构形式;并在C0语言的设计文档中总结上述2)和3)的理解结果、以及PL/0和C0的语法结构对比。

相关文档