- 1、本文档共19页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
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*)
(*Author: Niklaus Wirth*)
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); (* 目标代码中的操作码类型*)
instruction =
packed record
f: fct; (*操作码*)
l: 0..levmax; (*层差*)
a: 0..amax; (*相对地址*)
end;
(*
lit 0,a: 取常量a
opr 0,a: 执行a 运算
lod l,a: 取变量(相对地址为a ,层差为l)
sto l,a: 存变量 (相对地址为a ,层差为l)
cal l,a: 调用过程(入口地址为a ,层差为l)
int 0,a: 运行栈S 的指针值增加 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; (*运算符、界限符机内表示表
文档评论(0)