编译原理实验报告PL0语言功能扩充.docVIP

  • 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)

1亿VIP精品文档

相关文档