资源说明:PL/0语言是Pascal语言的一个子集,我们这里分析的PL/0的编译程序包括了对PL/0语言源程序进行分析处理、编译生成类PCODE代码,并在虚拟机上解释运行生成的类PCODE代码的功能。
PL/0语言编译程序采用以语法分析为核心、一遍扫描的编译方法。词法分析和代码生成作为独立的子程序供语法分析程序调用。语法分析的同时,提供了出错报告和出错恢复的功能。在源程序没有错误编译通过的情况下,调用类PCODE解释程序解释执行生成的类PCODE代码。
PL0的一部分代码:
program PL0 (input,output);
(*PL/0 compiler with code generation*)
(*Program 5.6 in Algorithms + Data Structures = Programs*)
(*Almost identical with the version in Compilerbau *)
label
99;
const
norw = 11; (*no. of reserved words*)
txmax = 100; (*length of identifier table*)
nmax = 14; (*max. no. of digits in numbers*)
al = 10; (*length of identifiers*)
amax = 2047; (*maximum address*)
levmax = 3; (*maximum depth of block nesting*)
cxmax = 200; (*size of code array*)
type
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,dosym,callsym,constsym,varsym,procsym);
alfa = packed array[1..al] of char;
object_1 = (constant,variable,prozedure);
symset = set of symbol;
fct = (lit,opr,lod,sto,cal,int,jmp,jpc); (*functions*)
instruction =
packed record
f: fct; (*function code*)
l: 0..levmax;(*level*)
a: 0..amax; (*displacement address*)
end;
(*
lit 0,a: load constant a
opr 0,a: execute operation a
lod l,a: load variable l,a
sto l,a: store variable l,a
cal l,a: call procedure a at level l
int 0,a: increment t-register by a
jmp 0,a: jump to a
jpc 0,a: jump conditional to a*)
.......
本源码包内暂不包含可直接显示的源代码文件,请下载源码包。