《PL0编译程序》.doc
文本预览下载声明
PL0编译程序
program PL0 ( input, output);
{带有代码生成的PL0编译程序}
label 99;
const
norw = 11; {保留字的个数}
txmax = 100; {标识符表长度}
nmax = 14; {数字的最大位数}
al = 10; {标识符的长度}
amax = 2047; {最大地址}
levmax = 3; {程序体嵌套的最大深度}
cxmax = 200; {代码数组的大小}
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 = (constant, variable, procedure);
symset = set of symbol;
fct = (lit, opr, lod, sto, cal, int, jmp, jpc); {functions}
instruction = packed record
f : fct; {功能码}
l : 0..levmax; {相对层数}
a : 0..amax; {相对地址}
end;
{LIT 0,a : 取常数a
OPR 0,a : 执行运算a
LOD l,a : 取层差为l的层﹑相对地址为a的变量
STO l,a : 存到层差为l的层﹑相对地址为a的变量
CAL l,a : 调用层差为l的过程
INT 0,a : t寄存器增加a
JMP 0,a : 转移到指令地址a处
JPC 0,a : 条件转移到指令地址a处 }
var
ch : char; {最近读到的字符}
sym : symbol; {最近读到的符号}
id : alfa; {最近读到的标识符}
num : integer; {最近读到的数}
cc : integer; {当前行的字符计数}
ll : integer; {当前行的长度}
kk, err : integer;
cx : integer; {代码数组的当前下标}
line : array [1..81] of char;
a : alfa;
code : array [0..cxmax] of instruction;
word : array [1..norw] of alfa;
wsym : array [1..norw] of symbol;
ssym : array [char] of symbol;
mnemonic : array [fct] of packed array [1..5] of char;
declbegsys, statbegsys, facbegsys : symset;
table : array [0..txmax] of
record
name : alfa;
case kind : object of
constant : (val : integer);
variable, procedure : (level, adr : integer)
end;
procedure error (n : integer);
begin
writeln(‘****’, ‘ ‘ : cc―1, ‘↑’, n : 2); err := err + 1
end {error};
procedure getsym;
var i, j, k : integer;
procedure getch ;
begin
if cc = ll then
begin
if eof(input) then
begin
write(‘PROGRAM INCOMPLETE’); goto 99
end;
ll := 0; cc := 0; write(cx : 5, ‘ ‘);
while eoln(input) do
begin
ll := ll + 1; read(ch)
显示全部