- 13
- 0
- 约6.89千字
- 约 13页
- 2017-09-02 发布于浙江
- 举报
编译原理实验报告PL0语言功能扩充
《编译原理》课程
实验报告
题目 PL/0编译程序的C语言扩充
专业 化学工程与工艺
班级
学号
姓名
任课教师
华东理工大学信息学院
一.实验题目
PL/0编译程序的C语言扩充
二.实验目的
在分析理解PL/0编译程序的基础上,对其词法分析程序、语法分析程序和语义处理程序进行部分修改扩充。
三.实验内容
在PL/0语言的基础上增加对整型一维数组的支持、扩充IF-THEN-ELSE条件语句、增加REPEAT语句、支持带参数的过程和增加注释等,如下所示:
整型一维数组,数组的定义格式为:
VAR数组标识名(下界:上界)
其中上界和下界可以是整数或者常量标识名。
访问数组元素的时候,数组下表是整型的表达式,包括整数、常量或者变量和他们的组合。
扩充条件语句,格式为:
条件语句?::=?条件语句 语句(3)增加REPEAT语句,格式为:
复合语句?::=?REPEAT语句条件
case IFSYM:
GetSym();
CONDITION(SymSetUnion(SymSetNew(THENSYM,DOSYM),FSYS),LEV,TX);
if (SYM==THENSYM) GetSym();
else Error(16);
CX1=CX; GEN(JPC,0,0);
STATEMENT(FSYS,LEV,TX);
CX2=CX; GEN(JMP,0,CX+1);
CODE[CX1].A=CX;
if (SYM==SEMICOLON) GetSym();
if(SYM==ELSESYM)
{
GetSym();
STATEMENT(FSYS,LEV,TX);
CODE[CX2].A=CX;
} //add the statement of ELSE
else STATEMENT(FSYS,LEV,TX);
break;
(4)修改单词:不等号# 改为
if (CH==)
{
GetCh();
if (CH===) { SYM=LEQ; GetCh(); }
else
if(CH==) { SYM=NEQ; GetCh(); }
else SYM=LSS;
六.实验设计思想
1.设计说明
PL/0语言是Pascal语言的一个子集,这里分析的PL/0的编译程序包括了对PL/0语言源程序进行分析处理、编译生成类PCODE代码,并在虚拟机上解释运行生成的类PCODE代码的功能。 PL/0语言编译程序采用以语法分析为核心、一遍扫描的编译方法。词法分析和代码生成作为独立的子程序供语法分析程序调用。语法分析的同时,提供了出错报告和出错恢复的功能。在源程序没有错误编译通过的情况下,调用类PCODE解释程序解释执行生成的类PCODE代码。词法分析子程序分析: 词法分析子程序名为,功能是从源程序中读出一个单词符号(),把它的信息放入全局变量 、和NUM中,语法分析器需要单词时,直接从这三个变量中获得。Getch过程通过反复调用Getch子过程从源程序过获取字符,并把它们拼成单词。过程中使用了行缓冲区技术以提高程序运行效率。 词法分析器的分析过程:调用时,它通过过程从源程序中获得一个字符。如果这个字符是字母,则继续获取字符或数字,最终可以拼成一个单词,查保留字表,如果查到为保留字,则把变量赋成相应的保留字类型值;如果没有查到,则这个单词应是一个用户自定义的标识符(可能是变量名、常量名或是过程的名字),把置为,把这个单词存入变量。查保留字表时使用了二分法查找以提高效率。如果etch获得的字符是数字,则继续用Getch获取数字,并把它们拼成一个整数,然后把SYM置为 INTEGER,并把拼成的数值放入NUM变量。如果识别出其它合法的符号(比如:赋值号、大于号、小于等于号等),则把则成相应的类型。如果遇到不合法的字符,把置成。语法分析子程序分析: 语法分析子程序采用了自顶向下的递归子程序法,语法分析同时也根据程序的语生成相应代码,并提供了出错处理的机制。语法分析主要由分程序分析过程()、ParaDeclaration)、参数变量处理过程(ParaGetSub)、数组处理过程(ParaGetSub)、常量定义分析过程(ConstDeclaration)、变量定
原创力文档

文档评论(0)