1 PL/0 编译器源程序分析 PL/0 语言是Pascal 语言的一个子集,我们这里分析的PL/0 的编译程序包括了对PL/0语言源程序进行分析处理、编译生成类PCODE 代码,并在虚拟机上解释运行生成的类PCODE 代码的功能
PL/0 语言编译程序采用以语法分析为核心、一遍扫描的编译方法
词法分析和代码生成作为独立的子程序供语法分析程序调用
语法分析的同时,提供了出错 报告和出错恢复的功能
在源程序没有错误编译通过的情况下,调用类PCODE 解释程序解释执行生成的类PCODE 代码
词法分析子程序分析: 词法分析子程序名为getsy m,功能是从源程序中读出一个单词符号(token),把它的信息放入全局变量 sy m、 id 和 nu m 中,语法分析器需要单词时,直接从这三个变量中获得
语法分析器每次用完这三个变量的值就立即调用getsy m 子程序获取新 的单词供下一次使用
而不是在需要新单词时才调用getsy m 过程
) getsy m 过程通过反复调用getch 子过程从源程序过获取字符,并把它们拼成单 词
getch 过程中使用了行缓冲区技术以提高程序运行效率
词法分析器的分析过程:调用getsy m 时, 它通过getch 过程从源程序中获 得一个字符
如果这个字符是字母,则继续获取字符或数字,最终可以拼成一个单词,查保留字表,如果查到为保留字,则把sy m 变量赋成相应的保留字类型值; 如果没有查到,则这个单词应是一个用户自定义的标识符(可能是变量名、常量名或是过程的名字),把sy m 置为ident,把这个单词存入id 变量
查保留 字表时使用了二分法查找以提高效率
如果getch 获得的字符是数字,则继续用getch 获取数字,并把它们拼成一个整数,然后把sy m 置为 nu mber,并把拼成的数值放入nu m 变量
如果识别出其