附录: 源代码
pl0c.h
/* 关键字个数 */
#de@ne norw 13
/* 名字表容量 */
#de@ne txmax 100
/* 所有的add1用于定义数组 */
#de@ne txmaxadd1 101
/* number的最大位数 */
#de@ne nmax 14
/* 符号的最大长度 */
#de@ne al 10
/* 地址上界 */
#de@ne amax 2047
/* 最大允许过程嵌套声明层数 */
#de@ne levmax 3
/* 最多的虚拟机代码数 */
#de@ne cxmax 200
#de@ne cxmaxadd1 201
/* 当函数中会发生fatal error时,返回-1告知调用它的函数,最终退出程序 */
#de@ne getsymdo if(-1==getsym())return -1
#de@ne getchdo if(-1==getch())return -1
#de@ne testdo(a,b,c) if(-1==test(a,b,c))return -1
#de@ne gendo(a,b,c) if(-1==gen(a,b,c))return -1
#de@ne expressiondo(a,b,c) if(-1==expression(a,b,c))return -1
#de@ne factordo(a,b,c) if(-1==factor(a,b,c))return -1
#de@ne termdo(a,b,c) if(-1==term(a,b,c))return -1
#de@ne conditiondo(a,b,c) if(-1==condition(a,b,c))return -1
#de@ne statementdo(a,b,c) if(-1==statement(a,b,c))return -1
#de@ne constdeclarationdo(a,b,c) if(-1==constdeclaration(a,b,c))return -1
#de@ne vardeclarationdo(a,b,c) if(-1==vardeclaration(a,b,c))return -1
typedef enum {false,true} bool;
/* 符号 */
enum symbol
{nul,ident,number,plus,minus,times,slash,oddsym,eql,neq,lss,leq,gtr,geq,lparen,rparen,comma,semicolon
,period,becomes,beginsym,endsym,ifsym,thensym,whilesym,writesym,readsym,dosym,callsym,constsym,
varsym,procsym};
#de@ne symnum 32
/* 名字表中的类型 */
enum object {constant,variable,procedur};
/* 虚拟机代码 */
enum fct {lit,opr,lod,sto,cal,inte,jmp,jpc};