### 山东大学编译原理实习题解析
#### 一. PL/0语言建立一个词法分析程序 GETSYM(函数)
##### **1. 概述**
在编译原理的学习过程中,词法分析器是一个非常重要的组成部分,它负责将源代码分割成一个个有意义的基本单位——记号或称为词法单元。在PL/0语言中,构建一个词法分析器GETSYM函数,主要是为了能够识别出关键字、标识符、常量以及其他语言元素。
##### **2. GETSYM的主要功能**
GETSYM函数的主要功能包括但不限于:
- **过滤空白字符**:在读取源代码的过程中,过滤掉单词之间的空白字符。
- **关键字识别**:通过查找关键字表来识别PL/0语言中的关键字,并将其内部编码存储到SYM中。
- **标识符识别**:标识符的类别被标记为IDENT,而标识符本身会被转换为机器内部表示并存储到ID中。
- **常量识别**:识别数字常量,并将其存储到NUM中。
- **运算符识别**:识别由两个字符组成的运算符,并将它们的类别存储到SYM中。
- **源代码打印**:在读取源代码的同时打印出来。
##### **3. 实现细节**
- **字符读取**:在GETSYM函数中定义了一个辅助过程GETCH,用于逐个读取源代码中的字符。
- **关键字与标识符的区别**:通过检查关键字表来确定读取的字符串是否为关键字。若不是,则认为是标识符。
- **长度限制**:考虑到效率问题,关键字或标识符的最大长度被限制为10个字符。
- **常量拼接**:如果读取的是数字,则进行拼接形成完整的数字常量。
#### 二. PL/0语言建立一个语法分析程序 BLOCK(函数)
##### **1. 概述**
语法分析器的作用是根据语言的文法规则来判断源代码是否符合语法规则,并构造抽象语法树(AST)。PL/0语言的语法分析器BLOCK函数不仅实现了这一功能,还同时进行了代码生成工作。
##### **2. BLOCK的主要功能**
BLOCK函数主要实现以下功能:
- **说明部分的处理**:对每个过程的说明对象创建名字表,记录标识符的层次、属性和分配的相对地址等信息。
- **语句处理和代码生成**:对语句进行语法分析,如果语法正确,则生成相应的目标代码。
##### **3. 说明部分的处理**
- **创建名字表**:对于每个过程(包括主程序),创建一个名字表来记录变量、常量和过程的信息。
- **层次划分**:主程序所在的层次为0层,其内部定义的过程为1层,以此类推。
- **相对地址分配**:对于变量,分配一个相对地址,以便于后续的代码生成。
- **过程体的处理**:对于过程名,保留其相对起始位置,待过程体的目标代码生成后再填充实际的入口地址。
##### **4. 语句处理和代码生成**
- **语法分析**:对每个语句进行语法分析,确保其符合PL/0语言的文法规则。
- **目标代码生成**:一旦语法分析确认无误,即可生成对应的目标代码。
- **标识符引用处理**:当遇到标识符时,查询名字表以获取其属性信息,如类型、地址等。
#### 总结
通过以上分析,我们可以看到GETSYM函数主要负责词法分析,即识别和分类源代码中的基本单位,而BLOCK函数则进一步实现了语法分析和目标代码的生成。这两个函数的结合使用,构成了PL/0语言编译器的重要组成部分。这些基础知识的学习对于深入理解编译原理以及开发更高级的编译器都有着至关重要的作用。