过主程序中调用分程序处理过程来分析分程序部分(分程序分析过程中还可能会有递归调
用过程),然后判断最后读入的符号是否为句号。如果是句号且分程序分析中未出错,则
是一个合法的 PL/0 程序,可以运行生成的代码,否则就说明源 PL/0 程序是不合法的,输
出出错提示即可。
下面按各语法单元分析 PL/0 编译程序的运行机制。
(1)分程序处理过程:
语法分析开始后,首先调用分程序处理过程处理分程序。过程入口参数置为:0 层、
符号表位置 0、出错恢复单词集合为句号、声明符或语句开始符。进入过程后,首先把局
部数据段分配指针设为 3,准备分配 3 个单元供运行期存放静态链 SL、动态链 DL 和返回
地址 RA。然后用 tx0 记录下当前符号表位置并产生一条 jmp 指令,准备跳转到主程序的
开始位置,由于当前还没有知到主程序究竟在何处开始,所以 jmp 的目标暂时填为 0,稍
后再改。同时在符号表的当前位置记录下这个 jmp 指令在代码段中的位置。在判断了嵌套
层数没有超过规定的层数后,开始分析源程序。首先判断是否遇到了常量声明,如果遇到
则开始常量定义,把常量存入符号表。接下去用同样的方法分析变量声明,变量定义过程
中会用 dx 变量记录下局部数据段分配的空间个数。然后如果遇到 procedure 保留字则进
行过程声明和定义,声明的方法是把过程的名字和所在的层次记入符号表,过程定义的方
法就是通过递归调用分程序分析的过程,因为每个过程都是一个分程序。由于这是分程序
中的分程序,因此调用时需把当前的层次号 lev 加一传递下去。分程序声明部分完成后,
即将进入语句的处理,这时的代码分配指针 cx 的值正好指向语句的开始位置,这个位置正
是前面的 jmp 指令需要跳转到的位置。于是通过前面记录下来的地址值,把这个 jmp 指
令的跳转位置改成当前 cx 的位置。并在符号表中记录下当前的代码段分配地址和局部数据
段要分配的大小(dx 的值)。生成一条 int 指令,分配 dx 个空间,作为这个分程序段的
第一条指令。下面就调用语句处理过程 statement 分析语句。分析完成后,生成操作数为
0 的 opr 指令,用于从分程序返回(对于 0 层的主程序来说,就是程序运行完成,退出)。
(2)常量定义过程:
通过循环,反复获得标识符和对应的值,存入符号表。符号表中记录下标识符的名字
和它对应的值。
评论2