第1章引论2PL0编译程序的实现详解.ppt

  1. 1、本文档共44页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
0 jmp 0 8 1 jmp 0 2 2 int 0 3 在运行栈中申请3个栈空间 3 lod 1 3 取b入栈 4 lit 0 10 取10入栈 5 opr 0 2 次栈顶与栈顶相加 6 sto 1 4 存入c 7 opr 0 0 退出过程p 8 int 0 5 在运行栈中申请5个栈空间 9 opr 0 16 从命令行读入输入置于栈顶 10 sto 0 3 将栈顶值存入变量b 11 cal 0 2 调用过程p 12 lod 0 4 将变量c取至栈顶 13 opr 0 14 栈顶值输出至屏幕 14 opr 0 15 换行 15 opr 0 0 结束程序 SL 0 DL 0 RA 0 变量b 变量c RA p SL p DL p 运行栈 Const a=10; var b,c; procedure p; begin c:=b+a; end; begin read(b); call p; write(c); end. SL:静态链 DL:动态链 RA:返回地址 0 PL/0语言的代码生成是由过程GEN完成。 GEN有三个参数,分别代表目标代码的功能码,层差和位移量。 gen(opr,0,16); gen(sto,lev-level,adr) 生成的代码顺序放在数组CODE中。 CODE为一维数组,数组元素为记录型数据。每一个记录就是一条目标指令。CX为指令的指针,由0开始顺序增加。实际上目标代码的顺序是内层过程的在前边,主程序的目标代码在最后。 PL/0编译程序代码生成 PL/0编译程序语法错误处理 对语法错误的两种处理方法: 对于易于校正的错误,如丢了逗号,分号等,指出出错位置,加以校正,继续进行分析。 对于难于校正的错误,给出错误的位置与性质,跳过后面的一些单词,直到下一个可以进行正常语法分析的语法单位。 在进入某个语法单位时,调用TEST滤去开始符号前的所有符号。 在语法单位分析结束时,调用TEST滤去当前符号到后继符号之间的所有符号。 ╳╳╳╳╳╳╳╳╳╳╳╳╳╳╳╳╳╳╳ TEST TEST 开始符号集合与后继符号集合 TEST SYM在S1中? 打印出错编号n S1:=S1+S2 SYM在S1中? GETSYM 返回 Y Y N N TEST 测试过程流程图 pcode代码解释器的实现 pcode解释器的结构 解释执行的流程图 目标代码解释执行时的存储分配 pcode解释器的结构 目标代码存放在数组CODE中。 解释程序定义的一维整型数组S作为运行栈 栈项寄存器t,基址寄存器b,程序地址寄存器p,指令寄存器i interpret 三个寄存器赋初值 t:=0; b:=1; p:=0; 主程序的SL,DL,RA赋初值 s[1]:=0; s[2]=0; s[3]=0; i:=code[p]; p:=p+1; 执行指令i P=0? 返回 解释执行的流程图 目标代码解释执行时的存储分配 几条典型指令的存储分配 INT 0 A 位于过程目标程序的入口,开辟A个单元的数据段。A为局部变量个数+3 OPR 0 0 位于过程目标程序的出口,释放数据段(退栈),恢复调用该过程前正在运行的过程的数据段基址寄存器B和栈顶寄存器T的值,并将返回地址送到指令地址寄存器P中,以使调用前的程序从断点开始继续执行 CAL L A 调用过程,还完成填写静态链、动态链、返回地址,给出被调用过程的基地址值,送入基址寄存器B中,目标程序的入口地址A的值送指令地址寄存器P中,使指令从A开始执行。 PL/0编译程序的实现 1 PL/0语言描述 2 PL/0编译程序的结构 3 PL/0编译程序的词法分析 4 PL/0编译程序的语法分析 5 PL/0编译程序的目标代码结构和代码生成 6 PL/0编译程序的语法错误处理 7 PL/0编译程序的目标代码解释执行时的存储分配 何为PL/0语言? PL/0语言:PASCAL语言的子集,功能简单,结构清晰,可读性强,具备了一般高级语言的必备部分 CONST A=10; VAR B,C; PROCEDURE P; VAR D; PROCEDURE Q; VAR X; BEGIN READ(X); D:=X; WHILE X#0 DO CALL P; END; BEGIN WRITE(D); CALL Q; END; BE

文档评论(0)

shuwkb + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档