编辑: 烂衣小孩 | 2016-03-13 |
2010 年1月14 日一目的与要求 目的:在分析理解一个教学型编译程序(如PL/0)的基础上,对其词法分析程序、语法分析程序和语义处理程序进行部分修改扩充.
达到进一步了解程序编译过程的基本原理和基本实现方法的目的. 要求:对PL/0作以下修改扩充: 基本内容 (1)扩充赋值运算:+= 和-= (2)扩充语句 REPEAT UNTIL 其中,是循环条件,即条件不成立时,重复执行循环体的< 语句序列>;
条件成立时,循环结束. 选做内容 (1)增加运算:++ 和--. (2)增加类型:① 字符类型;
实数类型. (3)扩充函数:① 有返回值和返回语句;
② 有参数函数. (4)增加一维数组类型(可增加指令). (5)其他典型语言设施. 二 环境与工具 (1)计算机及操作系统:PC机,Windows2000,WindowsXP (2)程序设计语言:Borland C++Builder
6 (3)教学型编译程序:PL/0 三 主要模块的描述: 1词法分析模块: 词法分析子程序名为GETSYM,功能是从源程序中读出一个单词符号(TOTAKEN),把它的信息放入全局变量 SYM、ID和NUM中,字符变量放入CH中,语法分析器需要单词时,直接从这三个变量中获得.Getch过程通过反复调用Getch子过程从源程序过获取字符,并把它们拼成单词.GETCH过程中使用了行缓冲区技术以提高程序运行效率. 词法分析器的分析过程:调用GETSYM时,它通过GETCH过程从源程序中获得一个字符.如果这个字符是字母,则继续获取字符或数字,最终可以拼成一个单词,查保留字表,如果查到为保留字,则把SYM变量赋成相应的保留字类型值;
如果没有查到,则这个单词应是一个用户自定义的标识符(可能是变量名、常量名或是过程的名字),把SYM置为IDENT,把这个单词存入ID变量.查保留字表时使用了二分法查找以提高效率.如果Getch获得的字符是数字,则继续用Getch获取数字,并把它们拼成一个整数或实数,然后把SYM置为 INTEGER或REAL,并把拼成的数值放入NUM变量.如果识别出其它合法的符号(比如:赋值号、大于号、小于等于号等),则把SYM则成相应的类型.如果遇到不合法的字符,把SYM置成NUL. 2语法分析模块: 语法分析子程序采用了自顶向下的递归子程序法,语法分析同时也根据程序的语义生成相应三元代码,并提供了出错处理的机制.语法分析主要由分程序分析过程(BLOCK)、参数变量分析过程(ParaDeclaration)、参数变量处理过程(ParaGetSub)、数组处理过程(ParaGetSub)、常量定义分析过程(ConstDeclaration)、变量定义分析过程(Vardeclaration)、语句分析过程(Statement)、表达式处理过程(Expression)、项处理过程(Term)、因子处理过程(Factor)和条件处理过程(Condition)构成.这些过程在结构上构成一个嵌套的层次结构.除此之外,还有出错报告过程(Error)、代码生成过程(Gen)、测试单词合法性及出错恢复过程(Test)、登录名字表过程(Enter)、查询名字表函数(Position)以及列出类 PCODE代码过程(Listcode)作过语法分析的辅助过程. 由PL/0的语法图可知:一个完整的PL/0程序是由分程序和句号构成的.因此,本编译程序在运行的时候,通过主程序中调用分程序处理过程block来分析分程序部分(分程序分析过程中还可能会递归调用block过程),然后,判断最后读入的符号是否为句号.如果是句号且分程序分析中未出错,则是一个合法的PL/0程序,可以运行生成的代码,否则就说明源PL/0程序是不合法的,输出出错提示即可. 3分程序处理模块: 语法分析开始后,首先调用分程序处理过程(Block)处理分程序.过程入口参数置为:0层、符号表位置