文档详情

《PL0编译程序》.doc

发布:2016-09-14约1.3万字共23页下载文档
文本预览下载声明
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)
显示全部
相似文档