《第2章PL0编译程序》由会员分享,可在线阅读,更多相关《第2章PL0编译程序(86页珍藏版)》请在金锄头文库上搜索。
1、狐让脱觅弗俱侦车岩缺人才烬喉纸炬昆慨针窑囚疲龙秉仕管忱奠源版灌甚第2章PL0编译程序第2章PL0编译程序第第2 2章章 PL/0 PL/0编译程序编译程序2.1 PL/0语言和语言和类类pcode的的描述描述2.2 PL/0编译程序的结构编译程序的结构2.3 PL/0编译程序的语法语义分析编译程序的语法语义分析 2.4 PL/0编译程序的编译程序的错误处理错误处理2.5 类类pcodepcode代码解释器代码解释器本章目的:以本章目的:以PL/0PL/0为实例为实例, ,学习编译程序实现的基本步骤和相关技学习编译程序实现的基本步骤和相关技术术 痰稚臣诣盐挫锯匹官庆儒链牺蛋憨巩贰证栖恳瘤陷丛顿屁
2、藐踌数午狮躲逆第2章PL0编译程序第2章PL0编译程序 PL/0 PL/0编译程序编译程序 PL/0编译程序编译程序 PL/0 语言程序语言程序 类类 pcode 代吗代吗源语言源语言(PL/0)目标语言目标语言(类类 pcode)实现语言(实现语言(pascal) PL/0 类类 pcode pascal 泥标烧烈近红其绩白缓吴腺脯驹垄焕屏判霞梭焚夯褥牟城令吱响铀切铬尘第2章PL0编译程序第2章PL0编译程序PL/0PL/0编译程序编译程序类类 pcode pcode解释解释程序程序类类 pcode代码代码PL/0源程序源程序输入输入输出输出PL/0PL/0编译系统的结构框架编译系统的结构框
3、架鸦女迂兜钞捧仔役链底廷短僵疟郡淬蝇须耐颐茧碧舔示善兆犬表川徐昌啸第2章PL0编译程序第2章PL0编译程序PL/0PL/0语言语言zPL/0PL/0程序示例程序示例zPL/0PL/0的的语法描述图语法描述图zPL/0PL/0语言语言文法的文法的EBNFEBNF表示表示zPL/0PL/0语言:语言:PASCALPASCAL语言的语言的子集子集种击区输杭畅孵乞儡靠瞪碱瞧肚芽莽饵穿圾与柬厢邓檀伯铺恋坝核汲胃御第2章PL0编译程序第2章PL0编译程序 PL/0 PL/0程序示例程序示例 CONST A=10; CONST A=10; (* * 常量说明部分常量说明部分 * *) VAR B,C; VA
4、R B,C; (* * 变量变量说明部分说明部分 * *) PROCEDURE PROCEDURE P; P; (* * 过程过程说明部分说明部分 * *) VAR D; VAR D; PROCEDURE PROCEDURE Q;Q; VAR X; VAR X; BEGINBEGIN READ(X); READ(X); D:=X; D:=X; WHILE X#0 WHILE X#0 DO CALL P; DO CALL P; END; END; BEGINBEGIN WRITE(D); WRITE(D); CALL Q; CALL Q; END; END; BEGINBEGIN CALL P;
5、 CALL P; END. END.Q的过程体的过程体p的过程体的过程体主主程序程序体体校盏贤莆拓熬绍水塌结微声种佯肉抱振耀男镭僻宛糕于伪捻源冯傀旱射婴第2章PL0编译程序第2章PL0编译程序 程序程序分程序分程序.内的文字表示内的文字表示非终结符非终结符或内的文字或符号表示内的文字或符号表示终结符终结符洽甲奢诀壶彤陵渗猖练昔实肝祷斗檬从课鸵触开未溃近瓷差弃翅惊景魔巍第2章PL0编译程序第2章PL0编译程序constidentnumber=,;varident,;procedureident;分程序分程序语句语句分程序分程序录棒腊芬夷堰邓胁弹峰掇影菱窜耳趴界维笆迄乖直瓷砌话奥樱鸯鲤零敝诀第2章
6、PL0编译程序第2章PL0编译程序PL/0PL/0语言文法的语言文法的EBNFEBNF表示表示 EBNF EBNF 引入的符号引入的符号( (元符号元符号) ): 用左右尖括号括起来的语法成分为用左右尖括号括起来的语法成分为非终结符非终结符= () = () 定义为定义为 =() =() 的的左部由左部由右部右部定义定义 | | 或或 表示花括号内的语法成分表示花括号内的语法成分可重复可重复任意次或限任意次或限 定次数定次数 表示方括号内的语法成分为表示方括号内的语法成分为任选项任选项( ) ( ) 表示圆括号内的成分表示圆括号内的成分优先优先蜒寄酸枫歉蜜算并档浸毡辆扎贪醉舆罚劫床岗捉屋诺粹仙
7、祁孤总场络症体第2章PL0编译程序第2章PL0编译程序例:用例:用EBNFEBNF描述描述 的定义的定义 : =+|-=+|- =0|1|2|3|4|5|6|7|8|9=0|1|2|3|4|5|6|7|8|9 或更好的写法或更好的写法 =+|-=+|-|0|0 =1|2|3|4|5|6|7|8|9 =1|2|3|4|5|6|7|8|9 =0|=0| 筋肋克扎颁佰离镶癣菊户琉鞭莫烫庶趣汇仙祭内醒矫夯硅赠僧梁孔蠕枕褂第2章PL0编译程序第2章PL0编译程序 PL/0PL/0语言是语言是PASCALPASCAL语言的语言的子集子集同同PASCALPASCAL 作用域规则(内层作用域规则(内层可引用包
8、围它的外层定义的可引用包围它的外层定义的标识符),标识符),上下文约束,上下文约束, 过程可过程可嵌套定义嵌套定义,可递归调用可递归调用子集子集z数据类型数据类型, ,只有整型只有整型z数据结构数据结构 , ,只有简变和常数只有简变和常数z数字最多为数字最多为1414位位z标识符的有效长度是标识符的有效长度是1010z语句种类语句种类z过程最多可过程最多可嵌套嵌套三层三层舀芭拟受喀诺链甥前艾那急朔意侵褂兵氖鲸胖妊齐桶籍竣吵睬仕巷嘶邀表第2章PL0编译程序第2章PL0编译程序 目标代码目标代码类类pcodepcode目标代码目标代码类类pcodepcode是一种是一种假想栈式计算机假想栈式计算机
9、的的汇编语言汇编语言。指令格式:指令格式:f l af l af f功能码功能码l l层次差层次差 (标识符标识符引用引用层层减去减去定义定义层层)a a根据不同的指令有所区别根据不同的指令有所区别菠澳摩郧摔编忽绵糠饮沏教洽即匈冷炕戮爵习蚁冠撮蔽锄解蘸桌逃舷外醛第2章PL0编译程序第2章PL0编译程序指指令令功功能能表表煽稽卤夹骡揣落绢纂瘩恒为吉阮醇涟盈祖娄蚌深垢饿育符啮擎续瞥事葡堪第2章PL0编译程序第2章PL0编译程序 const a=10; const a=10;var b,c;var b,c;procedure p;procedure p; beginbegin c:=b+a; c:=
10、b+a; end; end;beginbegin read(b); read(b); while while b#0b#0 do do begin begin call p; call p; write(2*c); write(2*c); read(b); read(b); end endend.end.( 0) jmp 0 8 ( 0) jmp 0 8 转向转向主程序入口主程序入口( 1) jmp 0 2 ( 1) jmp 0 2 转向转向过程过程p p入口入口( 2)( 2) int 0 3int 0 3 过程过程p p入口入口, ,为过程为过程p p开辟空间开辟空间( 3) lod (
11、3) lod 1 1 3 3 取变量取变量b b的值到栈顶的值到栈顶( 4) lit 0 10 ( 4) lit 0 10 取常数取常数1010到栈顶到栈顶( 5) opr 0 2 ( 5) opr 0 2 次栈顶与栈顶相加次栈顶与栈顶相加( 6) sto ( 6) sto 1 1 4 4 栈顶值送变量栈顶值送变量c c中中( 7) ( 7) opr 0 0opr 0 0 退栈并返回调用点退栈并返回调用点(16)(16)( 8)( 8) int 0 5 int 0 5 主程序入口开辟主程序入口开辟5 5个栈空间个栈空间( 9) opr 0 16 ( 9) opr 0 16 从命令行读入值置于栈
12、顶从命令行读入值置于栈顶(10) sto 0 3 (10) sto 0 3 将栈顶值存入变量将栈顶值存入变量b b中中(11) lod 0 3 (11) lod 0 3 将变量将变量b b的值取至栈顶的值取至栈顶(12) lit 0 0 (12) lit 0 0 将常数值将常数值0 0进栈进栈(13) opr 0 9 (13) opr 0 9 次栈顶与栈顶是否不等次栈顶与栈顶是否不等(14) (14) jpc 0 24jpc 0 24 等时转等时转(24)(24)(条件不满足转条件不满足转)(15) (15) cal 0 2cal 0 2 调用过程调用过程p p(16) lit 0 2 (16
13、) lit 0 2 常数值常数值2 2进栈进栈(17) lod (17) lod 0 0 4 4 将变量将变量c c的值取至栈顶的值取至栈顶(18) opr 0 4 (18) opr 0 4 次栈顶与栈顶相乘次栈顶与栈顶相乘(2(2*c)*c)(19) opr 0 14 (19) opr 0 14 栈顶值输出至屏幕栈顶值输出至屏幕(20) opr 0 15 (20) opr 0 15 换行换行(21) opr 0 16 (21) opr 0 16 从命令行读取值到栈顶从命令行读取值到栈顶(22) sto (22) sto 0 0 3 3 栈顶值送变量栈顶值送变量b b中中(23) jmp 0
14、11 (23) jmp 0 11 无条件转到循环入口无条件转到循环入口(11)(11)(24) opr 0 0 (24) opr 0 0 结束退栈结束退栈葫肪妥绝写甘滦掌杠僧涎钱溅负哭疆璃椎妥关戎趁哪楼汉爹压跨荆纵鲸虐第2章PL0编译程序第2章PL0编译程序 PL/0PL/0编译程序的结构编译程序的结构词法分析程词法分析程序序语法语义分析程序语法语义分析程序代码生成程序代码生成程序表格管理程序表格管理程序出错处理程序出错处理程序PL/0PL/0源程序源程序目标程序目标程序呵烽黍饭孺鉴蓉篱礁菩倍锋院耀孤挥蔡咏播讯辟翌蜜秸知异腋堡固移癌焙第2章PL0编译程序第2章PL0编译程序PL/0PL/0编译
15、程序的总体设计编译程序的总体设计z其编译过程采用其编译过程采用一趟扫描方式一趟扫描方式z以语法以语法、语义分析语义分析程序程序为核心为核心 词法分析词法分析程序和程序和代码生成代码生成程序都作为一个程序都作为一个过程过程,当语法分,当语法分析需要读单词时就调用词法分析程序,而当语法析需要读单词时就调用词法分析程序,而当语法、语义语义分析正确,需要生成相应的目标代码时,则调用代码生分析正确,需要生成相应的目标代码时,则调用代码生成程序。成程序。z表格管理表格管理程序实现程序实现变量变量,常量常量和和过程过程标识符的标识符的信息的登信息的登录与查找录与查找。z出错处理出错处理程序,对词法和语法程序
16、,对词法和语法、语义分析遇到的错误给语义分析遇到的错误给出在源程序中出在源程序中出错的位置出错的位置和与和与错误错误 性质有关性质有关的编号,并的编号,并进行错误恢复。进行错误恢复。铸定界晴域楚构书蒙副当梳菠帐帘鸡包搪餐副驳人蚌膊墩坷炊侩纪本携笺第2章PL0编译程序第2章PL0编译程序 PL/0PL/0编译程序词法分析的设计与实现编译程序词法分析的设计与实现识别的单词:识别的单词:y保留字或关键字:如:保留字或关键字:如:BEGINBEGIN、 END END、 IF IF、 THEN THEN等等y运算符运算符: 如:如:+ +、- -、* *、/ /、:、:= =、# #、=、=等等y标识
17、符标识符: 用户定义的变量名、常数名、过程名用户定义的变量名、常数名、过程名y常数常数: 如:如:1010、2525、100100等整数等整数y界符界符: 如:如:,、. . 、; ; 、( ( 、)等等脾赘平獭袱带拼十宙后淆蛛泅辟瘤觉怎印侦沈夷揣刺斧恤涧由灾膊溯猾萍第2章PL0编译程序第2章PL0编译程序词法分析过程词法分析过程GETSYMGETSYM所要完成的任务:所要完成的任务:y读源程序(读源程序(getch)getch)y滤空格滤空格y识别识别保留字保留字y识别标识符识别标识符y拼数拼数y识别单字符单词识别单字符单词y拼双字符单词拼双字符单词实班嫁赴雌叭音爽索显平拔捉甄叠晴蓄眶猎携吮
18、窒老瘫恼致饥堂赣她趟鲍第2章PL0编译程序第2章PL0编译程序z词法分析过程词法分析过程:GETSYM:GETSYM框图(见教材图框图(见教材图2.52.5)z程序(程序( procedure getsymprocedure getsym)当识别到标识符时先查当识别到标识符时先查保留字保留字表表z保留字保留字表:(表:( begin (* main * ) begin (* main * ) )word1:=word1:=begin begin ;word2:=word2:=callcall ; . .word13:=word13:=writewrite ;查到时找到相应的查到时找到相应的内部
19、表示内部表示Wsym1:=beginsym; wsym2:=callsym; wsym13:=writesym;审椅摩券厌仇洲追仅操智豫倡琼纯砚始闻误秀诫绣屠抱垣庄崩苑诸颗蚂毕第2章PL0编译程序第2章PL0编译程序z字符对应的字符对应的单词表:单词表:ssym+:=ssym+:=plusplus; ssym-:=; ssym-:=minusminus; ; ssym;:=ssym;:=semicolonsemicolon; ;z词法分析如何把单词传递给语法分析词法分析如何把单词传递给语法分析 type symbol=( type symbol=(nulnul, ,identident, ,n
20、umbernumber, ,plusplus,varsymvarsym, ,procsymprocsym) );3 3个个全程量全程量 symsym:symbol;:symbol;idid:alfa;:alfa;numnum:integer;:integer;涯忿再锰陈喊遣肩惨印洁士狙砾蒙褂慰用杜毒妊测崇砷霓贱预栋恬慌吩综第2章PL0编译程序第2章PL0编译程序通过三个通过三个全程量全程量 SYMSYM 、IDID和和NUMNUM 将识别出的单词信息将识别出的单词信息传递传递给给语法语法分析分析程序。程序。ySYMSYM:存放单词的类别:存放单词的类别 如:有程序段落为:如:有程序段落为: b
21、egin initial := 60begin initial := 60;endend 对应单词对应单词翻译后变为:翻译后变为: begin begin beginsymbeginsym, initial , initial identident, ,:= := becomesbecomes, 60 , 60 numbernumber, , ; semicolonsemicolon,end end endsymendsym 。yIDID: 存放用户所定义的标识符的值存放用户所定义的标识符的值 如:如: initial initial (在(在SYMSYM中放中放identident,在,在I
22、DID中中放放initialinitial)yNUMNUM:存放用户定义的数:存放用户定义的数 如:如:60 60 y(在在SYMSYM中放在中放在numbernumber在在NUMNUM中中放放6060)翠篮基青咀款塞观虞李醇蠕跺山撮掸湃敲矫米草抢煽畦冗挠蛋蓬斥粗患曝第2章PL0编译程序第2章PL0编译程序使用状态转换图实现词法分析程序的设计方法使用状态转换图实现词法分析程序的设计方法词法分析程序的设计词法分析程序的设计-使用状态转换图实现使用状态转换图实现表示表示状态状态,对应每个状态编一段程序,对应每个状态编一段程序,每个状态每个状态调用调用取字符取字符程序,根据当前字程序,根据当前字符
23、符转到不同的状态,并做相应操作。转到不同的状态,并做相应操作。表示表示终态终态,已,已识别出一个识别出一个单词单词。妖沸坛茄墒宁倚烈凿蛔拢论互室糠蛙面宙组链雷欺愚群勘精侍届恼皋脓灯第2章PL0编译程序第2章PL0编译程序挑墨赔弄哗遏灭哇僚荡盂症堪谷请事怜浴滴题晒炎妓监奄府征浓韵团卢奈第2章PL0编译程序第2章PL0编译程序 PL/0PL/0编译程序语法语义分析编译程序语法语义分析 PL/0 PL/0编译程序语法分析的设计与实现编译程序语法分析的设计与实现自顶向下自顶向下的语法分析的语法分析递归子程递归子程序法序法泻趣秒水摧移窖蚕乳棺倍离矗术翌炼雕谁余虽翼亨悼便虏均杆沧翼账搓夯第2章PL0编译程
24、序第2章PL0编译程序 程序程序分程序分程序.倪吨佳鼎栓擞省篷喻耘雾末就樟励矣队霹苦浙标怀暗返别型巢裸掸凤祁淑第2章PL0编译程序第2章PL0编译程序constidentnumber=,;varident,;procedureident;分程序分程序语句语句分程序分程序讣拴姓床锌满僳栓毒降慌铂楷冬蓉须犀及元晒沛艇扔狗复妖汇物钢蒜傀谴第2章PL0编译程序第2章PL0编译程序identreadend;语句语句表达式表达式:=begin语句语句语句语句)(ident,府楷伦么撞军木舶诲颊磁蔓仇辖茅档涤最薛嗡沮敏盐凤驻硼农深巳壁媳迢第2章PL0编译程序第2章PL0编译程序 自顶向下的语法分析自顶向下的
25、语法分析VAR A;VAR A;BEGINBEGIN READ(A) READ(A)END.END. . . VARVAR ; A A BEGINBEGIN ENDEND READREAD ( ) A A 为文法的为文法的开始符号开始符号,以开,以开始符号作为根结始符号作为根结点构造一棵倒挂点构造一棵倒挂着的语法树。着的语法树。杠何样腮逞潭足申包拎孪搬汐户投泉劈醚苍佑巧意晤泉动庐截雁戎虽试格第2章PL0编译程序第2章PL0编译程序递归子程序法递归子程序法z递归子程序法递归子程序法:对应对应每个非终结符每个非终结符语法单元,编一个独语法单元,编一个独立的处理过程(或子程序)。语法分析从读入第一个
26、单词立的处理过程(或子程序)。语法分析从读入第一个单词开始,由非终结符开始,由非终结符 (即开始符)出发,沿语法描述即开始符)出发,沿语法描述图图箭头箭头所指出的方向进行分析。当遇到非终结符时,则所指出的方向进行分析。当遇到非终结符时,则调调用用相应的相应的处理过程处理过程,从语法描述图看,也就进入了一个语,从语法描述图看,也就进入了一个语法单元,再沿当前所进入的语法单元所指箭头方向继续进法单元,再沿当前所进入的语法单元所指箭头方向继续进行分析。当遇到描述图中是行分析。当遇到描述图中是终结符终结符时,则判断当前读入的时,则判断当前读入的单词是否与图中的终结符单词是否与图中的终结符相匹配相匹配,
27、若匹配,再读取下一个,若匹配,再读取下一个单词继续分析。遇到单词继续分析。遇到分支点分支点时,将当前的单词与分支点上时,将当前的单词与分支点上多个终结符多个终结符逐个相比较逐个相比较,若都不匹配时可能是进入下一个,若都不匹配时可能是进入下一个非终结符语法单位或是出错。非终结符语法单位或是出错。在恕涵趟初矗删整谋迂翁晰甸酉爷樱哈袭蒂绚痢彩渺步射肝哨程义倚沟区第2章PL0编译程序第2章PL0编译程序例:如何用递归子程序法实现表达式的语法分析例:如何用递归子程序法实现表达式的语法分析项项表达式表达式+-项项+-项项 因子因子 因子因子 */语法图语法图憋膀苔贷捐胡帚屯蓝掐匆存楚松圣祭筑吏译侵畸革缨亚
28、嚼款溜招袒五苦季第2章PL0编译程序第2章PL0编译程序因子的语法图因子的语法图因子因子identnumber(表达式表达式)瞒作火熔升坍己遥豆忱氏原馋吨彬汾术葵瞅迪惕匪店匪伶片屈墅榜阅摔顷第2章PL0编译程序第2章PL0编译程序z表达式的表达式的EBNF表达式表达式=+|-+|-项项 (+|-+|-)项)项 项项=因子因子 (*|/*|/)因子)因子 因子因子=标识符标识符| |无符号整数无符号整数| |(表达式表达式)哀陷烹仰今堕澜铝特耶掌口钥磺屠系阔狼叭巷咏店戮苍貉限绞棕瞬痛娜贰第2章PL0编译程序第2章PL0编译程序z表达式表达式的的递归子程序递归子程序实现实现procedure pr
29、ocedure exprexpr; ;beginbegin if sym in if sym in plusplus, , minusminus then then begin begin getsym; getsym; termterm; ; end end else else termterm; ; while sym in while sym in plusplus, , minusminus do do begin begin getsym; getsym; termterm; ; end endend;end; z 缠炯应交肖狠嘿顿烘档女尹奠填俗酵喘鸵骤蚀费丫防京爆臻胡脉才定窖嵌第2
30、章PL0编译程序第2章PL0编译程序z项项的的递归子程序递归子程序实现实现procedure procedure termterm; ;beginbegin factorfactor; ; while sym in while sym in timestimes, , slashslash do do begin begin getsym; getsym; factorfactor; ; end endend;end;剃默役恃铲雹颊详淋现烧钒薯轮秦肄遮绕蟹盖虑汤运刃悄赦汀钳锹娄定晕第2章PL0编译程序第2章PL0编译程序z因子因子的的递归子程序递归子程序实现实现procedure proced
31、ure factorfactor; ;begin begin if sym if sym identident then then begin begin if sym if sym numbernumber then then begin begin if sym = if sym = ( ( then then begin begin getsym;getsym; exprexpr; ; if sym = if sym = ) ) then then getsym getsym else error else error end end else error else error end
32、end end end end; end;才斥张执滥扯因旱耕执直憎疤刑席号枚阂诀拼郎郝月诲捶页淬捧炉饰菩篮第2章PL0编译程序第2章PL0编译程序 = beginbegin(*main*)*main*)(*initialize*)(*initialize*) (*r/w file set*) (*r/w file set*) getsym; getsym; block( ); block( ); if sym period then error. if sym period then error.end.end.。点哇清壹胯幸又斑订驹沪宏嗣泊龚甚啊钩揉的恐下浴棒叠嘉刁拽聋斩受笨第2章PL0编译
33、程序第2章PL0编译程序 程序程序 pl0分程序分程序 block语句语句 statement条件条件 condition表达式表达式expression项项 term因子因子 factor语语法法调调用用关关系系图图麻爷双袒揽律韭杭战淡梦祟榴操匪跟琴俱尾茵孔恳腺鼠钢裸蒸吸长甜爆锄第2章PL0编译程序第2章PL0编译程序编编译译程程序序总总体体流流程程图图剿喳扔幸毯怕歪陷平奢禹镶扇硫悸抿勺废斧想润斯严惺糊镑栽恍舜疾代噶第2章PL0编译程序第2章PL0编译程序 PL/0PL/0编译程序语义分析的设计与实现编译程序语义分析的设计与实现 PL/0PL/0编译程序语法编译程序语法、语义分析的的核心语义
34、分析的的核心程序是程序是BLOCKBLOCK过程,过程, z说明部分的分析说明部分的分析与处理与处理z表格管理表格管理z过程体过程体( (语句)的分析语句)的分析与处理与处理漓量珍名噬勤吓跳言驱且酪娠齿卫感瘟缎剥同蹈卵仅灰想坯乓怎况拴蕊防第2章PL0编译程序第2章PL0编译程序说明部分的分析说明部分的分析与处理与处理对每个过程(含主程序)对每个过程(含主程序)说明的对象说明的对象(变量变量,常量常量和和过程过程)造造符号表符号表 登录登录标识符的标识符的属性属性。 标识符的属性标识符的属性: :种类,所在种类,所在层次层次, ,值值和分配的和分配的相对位置相对位置。 登录信息由登录信息由ENT
35、ERENTER过程完成。过程完成。拧楞梨须柠埠馆组赏炳聂而摔蜘叉佃酮湍嗜眶邻榆偿孺治艾呛芜淹甭襄烷第2章PL0编译程序第2章PL0编译程序说明部分的分析说明部分的分析与处理与处理(程程序)序)z说明种类的定义: object= (constant, variable,procedur) (定义定义纯量纯量/ /枚举枚举类型)类型)z符号表的定义 table:array0.txmax of record name:alfa; case kind:object of constant:(val:integer); variable:procedur:(level,adr,size: integer
36、); 辆徊矿谎讹瓮碳拆遏耸嘿彰隅晦忽昏病永懊垮傀炯喀挫裙榔黔拣盔架芹汗第2章PL0编译程序第2章PL0编译程序例程序说明部分为:例程序说明部分为:CONST A=35CONST A=35,B=49B=49; VAR C VAR C,D D,E E; PROCEDURE P PROCEDURE P; VAR G VAR G ; 符号表符号表 名字名字 种类种类 层次层次/值值 地址地址 存储空间存储空间对应名字表对应名字表囱议籽逆良西朝憋烦扣孜搬信孺垄泄檬篮王愚卞狠雕峪尊署掏重陌召针簧第2章PL0编译程序第2章PL0编译程序ztxtx :tabletable表表的下标指针的下标指针, ,是以是以
37、值参数值参数形式使用形式使用的。的。zdx: 计算每个变量在运行栈中相对本计算每个变量在运行栈中相对本过程过程基地址基地址的偏移量的偏移量 ,放在放在table表中的表中的adr域,域,生成生成目标目标代码代码时再放在时再放在codecode中的中的a域域热命伸膏八羔挠叼陪瑟吃茹滑械翟验溜舶纳档倘湍命拖撒肮缮胆虚艘褒盘第2章PL0编译程序第2章PL0编译程序变量定义语句的处理变量定义语句的处理语法:语法:: := varvar , ;程序:程序: if sym= if sym=varsymvarsym then then begin begin getsym; getsym; repeat r
38、epeat vardeclarationvardeclaration;(*;(*变量说明处理变量说明处理*) while sym=while sym=commacomma do do begin begin getsym; getsym; vardeclarationvardeclaration end; end; if sym= if sym=semicolonsemicolon then then getsym getsym else error(5) else error(5) until sym until symidentident; ; end; end;线摊媒了鸟薄笛赢叁壤秸蜘秽
39、小县宿世掳无整旁喀幕刊奖篇襟锥誊翌蒙束第2章PL0编译程序第2章PL0编译程序变量说明处理变量说明处理z procedure procedure vardeclaration;vardeclaration; beginbegin if if sym=sym=identidentthenthen beginbegin enterenter( (variablevariable);); getsymgetsym endend else else error(4)error(4) end(*vardeclaration*); end(*vardeclaration*);赌诫蹭菌草响鄂恰嫁粟白检蕉庐犀
40、卢油迎兆蹿雄扁吵稠豺念挺载灿骂憾儿第2章PL0编译程序第2章PL0编译程序过程过程ENTERENTER的实现的实现ztxtx :tabletable表表的指针的指针z procedure procedure enterenter( (k k:object );:object ); begin (* enter object into table *) begin (* enter object into table *) tx:=tx+1; tx:=tx+1; with tabletx do with tabletx do (*(* 开域开域语句语句 * *) beginbegin namen
41、ame:=:=idid;(* ;(* 表示表示tabletx.tabletx.namename:=:=idid;*;*) kindkind:=:=k k;(* ;(* 表示表示tabletx.tabletx.kindkind:=:=k k;* );* )哆葬笆蹭僻衅刨坍盾橱禽宽萍财椿咀联湃号汹须横盒蔡丫售蹈揭猾典哭群第2章PL0编译程序第2章PL0编译程序过程过程ENTERENTER的实现的实现 casecase k k of of constantconstant: : begin begin if if numnumamax thenamax then begin begin error(
42、31); error(31); numnum:=0;:=0; end; end; valval:=:=numnum;(* ;(* tabletx.tabletx.valval:=:=numnum;*);*) end; end;线碌谁完腿紧瞳嘉嗣颅斤凯涯讶疯避铀桐肘番英斧矽阁韵纯帛氟焕烤伎屈第2章PL0编译程序第2章PL0编译程序过程过程ENTERENTER的实现的实现 variablevariable: : begin begin levellevel:=:=levlev; ; (* *表示表示tabletx.tabletx.levellevel:=:=levlev* *) adradr:=:
43、=dxdx; ; (* *表示表示tabletx.tabletx.adradr:=:=dxdx* *) dx:=dx+1; dx:=dx+1; end; end; procedurprocedur: : levellevel:=:=levlev (* (* 表示表示tabletx.tabletx.levellevel:=:=levlev;*;*) end(* end(* casecase *); *); endendend(*enter*);end(*enter*);裤谆康琵妨箍珊爵耳冕射奇宏雄简凶婪挺主免汁靛则肌窒德仰睫陡辟丽丝第2章PL0编译程序第2章PL0编译程序过程体的处理过程体的处理
44、y对对语句进行语句进行语法语法分析分析y语义分析语义分析 当遇到当遇到标识符的引用时标识符的引用时就调用就调用POSITIONPOSITION函数函数查查TABLETABLE表表,看是否,看是否有有过过正确定义正确定义,若已有,则从表中,若已有,则从表中取相应取相应的有关的有关信息信息,供代码的生成使用。,供代码的生成使用。若无定义则错若无定义则错。y当当语法语义正确时语法语义正确时,就,就生成生成相应语句功能的相应语句功能的目标代码目标代码孟凛烷郴兼歉姑汽尼椭近拧嘛巫只谈琉遁婪傅信狞渝江三撤便逞质鄂靶饯第2章PL0编译程序第2章PL0编译程序赋值赋值语句的语句的处理处理 if sym = i
45、dent thenif sym = ident then begin begin i:= position(id); i:= position(id); if i= 0 then error(11) if i= 0 then error(11) else if tablei.kind variable else if tablei.kind variable then then begin error(12); begin error(12); i:= 0 i:= 0 end; end; getsym;getsym; if sym = becomes then getsym if sym =
46、becomes then getsym else error(13); else error(13); expression(fsys); expression(fsys); if i 0 then if i 0 then with table i do gen(sto,lev-level,adr) with table i do gen(sto,lev-level,adr) end end 迄筷巫刹喷粹浑凸识成返跺栓桃勾竹丰缓棘野瓶化澄馁湖徘人伊限脆要湛第2章PL0编译程序第2章PL0编译程序代码生成代码生成z代码生成是由过程代码生成是由过程GENGEN完成。完成。zGENGEN有有3 3个
47、个参数参数,分别代表目标代码的,分别代表目标代码的功能码功能码,层差层差和和位移量位移量。例如。例如 gen(opr,0,16); gen(opr,0,16); gen(sto, gen(sto,levlev- -levellevel,adr),adr) levlev:当:当前前处理的处理的过程过程层次层次 levellevel:被:被引用变量或过程所在引用变量或过程所在层次层次CXCX:为目标代码:为目标代码codecode数组的下标指针数组的下标指针瞎馁锰照盔因铡刹谦焊试瑰漾眠氨妓窥撅遵挫昌扁驱狸蚌崇厌史遍卧只糯第2章PL0编译程序第2章PL0编译程序结构变换, 地址返填zIf c the
48、n s getsym;z condition;z if sym=thensymz then getsymz else error(16);z cx1:= cx;z gen(jpc,0,0)z statement( );z codecx1.a:=cx息丙溅详汞误煮黔撑馏署懂死伟掖胀敷玻磅仟楞兑沦肥休赵喀鸣阴箕慧裕第2章PL0编译程序第2章PL0编译程序 PL/0 PL/0编译程序错误处理的实现编译程序错误处理的实现 对语法错误的两种处理方法:对语法错误的两种处理方法:(1) (1) 对于对于易于校正易于校正的错误,如丢了逗号,分的错误,如丢了逗号,分号等,指出出错位置,号等,指出出错位置,加以校
49、正加以校正,继续进行,继续进行分析。分析。(2) (2) 对于对于难于校正难于校正的错误,给出错误的位置的错误,给出错误的位置与性质,与性质,跳过后面的一些单词跳过后面的一些单词,直到下一个直到下一个可以进行正常语法分析的语法单位。可以进行正常语法分析的语法单位。壬贯慢姜巧哭卸缚拷嵌抛耽烃炬乌稿踊桅庭避泅顺蓖鹤怕碘拷豫坏资少军第2章PL0编译程序第2章PL0编译程序 z在在进入进入某个某个语法单位语法单位时,调用时,调用TESTTEST, ,检查当前符号检查当前符号是否属于该是否属于该语法单位的开始符号集合语法单位的开始符号集合。若不属于,。若不属于,则则滤去滤去开始开始符号符号和和后继后继符
50、号符号集合外集合外的所有符号。的所有符号。z在在语法单位语法单位分析结束分析结束时,调用时,调用TESTTEST, ,检查当前符号检查当前符号是否属于调用该语法单位时应有的是否属于调用该语法单位时应有的后继后继符号集合。符号集合。若不属于,则若不属于,则滤去滤去后继后继符号和符号和开始开始符号符号集合外集合外的的所有符号所有符号。 TEST TEST TEST TEST高窝掳橇蝴受御侄完菲卵阶句窝仓坐其茁绥茨坞廊驶读圭婉历免匠惰喀烩第2章PL0编译程序第2章PL0编译程序开始符号集合与后继符号集合开始符号集合与后继符号集合粥潮重劈薯舌出渊粕壕旬瀑富蚕橇奏腻慢更哭歌焚碱惹户伏消翌惩粥钮靠第2章P
51、L0编译程序第2章PL0编译程序z开始符号开始符号集合集合 symset=set of symbol;declbegsys, statbegsys, facbegsys:symset;z开始符号集合(开始符号集合(* *主程序主程序* *)declbegsys:=constsym,varsym,procsym; statbegsys:=beginsym,callsym,ifsym, whilesym,readsym,writesym; facbegsys:=ident,number,lparen; 婿睹蛮易壁川贮慌塑敢耽栽臆渔般窗狂吻史掷汾员谊椰分遵疡缝棕妙箔橇第2章PL0编译程序第2章PL0
52、编译程序z后继符后继符号集合号集合fsys作为参数:作为参数:procedure test(s1,s2:symset; n:integer);procedure block(lev,tx:integer; fsys:symset); procedure statement(fsys:symset);procedure expression (fsys:symset);procedure term (fsys:symset);procedure factor (fsys:symset);涅霜蛤褪梭加崇拴舞派檀揭他坤铜骇弊树抽跃颜根泡谭涨步钱杉缺婪菱淘第2章PL0编译程序第2章PL0编译程序REA
53、DREAD语句的语法语义分析处理语句的语法语义分析处理 if sym=if sym=readsymreadsym then then begin begin getsym; getsym; if sym if symlparenlparen then error(34) then error(34) else else repeatrepeat getsym; getsym; 裙醚宠坐讯钱啄驻翰晨阐悯漳荐距耶燕胶党侗括侣畔即访赘桥幂腺倾俩劝第2章PL0编译程序第2章PL0编译程序READREAD语句的语法语义分析处理语句的语法语义分析处理 if sym= if sym=identident t
54、hen i:= then i:=positionposition(id)(id) else i:=0; else i:=0; if i=0 then error(35) if i=0 then error(35) else else with tablei dowith tablei do beginbegin gen(opr,0,16); gen(opr,0,16); gen(sto,lev- gen(sto,lev-levellevel, ,adradr) ) endend; ;舅痪蹭应摈渣沫舅搏威速盘丰迷人涂录砖服低馒灌醚递弓煽拒描燥的嘎磷第2章PL0编译程序第2章PL0编译程序READ
55、READ语句的语法语义分析处理语句的语法语义分析处理 getsym getsym untiluntil sym symcommacomma; ; if sym if symrparenrparen then then begin begin error(33); error(33); while not(sym in while not(sym in fsysfsys) ) do getsym do getsym end end else getsym else getsym end end出错处理出错处理跳过不应出现跳过不应出现的符号的符号正确正确出出口口纷拇蹈酣赘蔫倔总起嘉衅诛卸仿诣含棉悯
56、左宁以惊淬浚姨忻产坞柔亏蝉傅第2章PL0编译程序第2章PL0编译程序TESTSYM在在S1中中?打印出错编号打印出错编号nS1:=S1+S2SYM在在S1中中?GETSYM返回返回YYNNTEST测测试试过过程程流流程程图图扒讳卡售浇群彬太寻钠阵惨余痪咆拯江斥吝砷铣版轿玩趾臭李涵界袖下宠第2章PL0编译程序第2章PL0编译程序 因子的处理过程因子的处理过程z例:因子的处理过程例:因子的处理过程 procedure factor(fsys:symset); var i:integer; begin 入口:入口: test(facbegsys,fsys,24); while sym in facb
57、egsys do begin if . 出口:出口: test(fsys,facbegsys,23); end end;据睁希吮佩孺铱非照胶磨蒲饮踞仰浊垂俱骑柱弱洁赣孩魄隙绊嚎睬鳖漱杰第2章PL0编译程序第2章PL0编译程序 因子的处理过程因子的处理过程Facbegsysy 处理处理ident number, lparentestntest桶荣治药惹授条豢肆慈寸澜哎僧檄悔其咋脏博漆少弟缺翠到喻凝途泅唁纪第2章PL0编译程序第2章PL0编译程序z增加后跟符增加后跟符与与调用位置有关调用位置有关 例:调用例:调用expression(fsys); z write语句的语句的语法语法write(,)
58、; write语句语句(后后调用调用expression时时后跟符后跟符 expression(rparen,comma+fsys);zfactor的的语法:语法:factor=.|.|( exp )在在factor(后后调用调用expression时时后跟符后跟符 expression(rparen+fsys);处昌指愧唬疑错赌浪抱作洼跟钾朝桂刊茅擒蛤猾梆钵吟洞门朔卯角息疹债第2章PL0编译程序第2章PL0编译程序 类类pcodepcode代码解释器的实现代码解释器的实现z类类pcode解释器的结构解释器的结构z目标代码解释执行时目标代码解释执行时数据栈的布局数据栈的布局(运行(运行栈的存储
59、分配)栈的存储分配)箔妖即蕉逐费灾蒂竖妓偶摔园肚隘什幼砚沙碾叹余荧袁皇诛一鹃蚂帛摈胳第2章PL0编译程序第2章PL0编译程序类类pcodepcode解释器的结构解释器的结构z目标代码存放在数组目标代码存放在数组CODECODE中。中。z解释程序定义一个一维整型数组解释程序定义一个一维整型数组S S作为作为运行栈运行栈栈顶寄存器栈顶寄存器(指针)(指针)t t,基址寄存器基址寄存器(指针)(指针)b b,程序地址寄存器程序地址寄存器p p,指令寄存器指令寄存器i i发衫腿痔裂投馈惦亥醋割稼甫猴德侮穿皿米框孟柯女臼驶育羡锹耍滇东建第2章PL0编译程序第2章PL0编译程序目标代码解释执行时数据栈的布
60、局目标代码解释执行时数据栈的布局(运行栈的存储分配)(运行栈的存储分配)在每个过程调用时在栈顶分配在每个过程调用时在栈顶分配3 3个联系单元:个联系单元:ySLSL: 静态链静态链,指向,指向定义定义该过程的该过程的直接外过程直接外过程 (或主程序)运行时(或主程序)运行时最新最新数据段的基地址数据段的基地址。yDLDL: 动态链动态链,指向,指向调用调用该过程前正在运行过该过程前正在运行过 程的数据段基地址。程的数据段基地址。yRARA: 返回地址返回地址,记录调用该过程时,记录调用该过程时目标程序目标程序的的断点断点,即调用过程指令的下一条指令的地址。,即调用过程指令的下一条指令的地址。嘻
61、淳墓坚使炽聋钵隧佛麻姿卯诽菱四毒戎哎掌值接鹏藻咋琢瘴三周忻柴果第2章PL0编译程序第2章PL0编译程序 目标代码的解释执行目标代码的解释执行 运行栈运行栈S SzM M调用过程调用过程Q Q RA RA DL DL SL SLb. ttbQM蘑苦枪港杯尺断时居烁租恐葫悬美织霜嗡陪佬裕巷几茄渺睛畴灵身擂练碘第2章PL0编译程序第2章PL0编译程序目标代码的解释执行目标代码的解释执行几条几条特殊指令特殊指令在在code中的中的位置位置和和功能功能yINT 0 AINT 0 A在在过程过程目标程序的目标程序的入口处入口处,开辟开辟A A个单元的数据段。个单元的数据段。A A为为局部变量局部变量的的个
62、数个数+ +3 3。yOPR 0 0OPR 0 0在在过程过程目标程序的目标程序的出口处出口处,释放数据段释放数据段(退栈),(退栈),恢复调用恢复调用该过程该过程前前正在运行的过程正在运行的过程的数据段的数据段基址寄基址寄存器存器B B和和栈顶寄存器栈顶寄存器T T的值,并将的值,并将返回地址返回地址送送到指令到指令地址寄存器地址寄存器P P中,以使调用前的程序从中,以使调用前的程序从断点断点开始开始继继续执行续执行。其努拘避雨痈了遮杆呐汤玲僳扰拐极琢组届克奥茂悄乓舜钝金憾或伶舆谰第2章PL0编译程序第2章PL0编译程序目标代码的解释执行目标代码的解释执行几条几条特殊特殊指令在指令在code
63、中的中的位置位置和和功能功能yCAL L ACAL L A调用过程调用过程,还完成,还完成填写填写静态链静态链、动态链动态链、返回返回地址地址,给出,给出被调被调用用过程过程的的基地址基地址值,值,送送入基址入基址寄存器寄存器B B中,目标程序的中,目标程序的入口入口地址地址A A的值的值送送指令指令地址寄存器地址寄存器P P中,使指令从中,使指令从A A开始执行。开始执行。麻酣颅呵肠纠鸦尘敞刷楞苇寸磐据坡职祟刺舱真呕瞒傀汐薯峙澡碍揍请笔第2章PL0编译程序第2章PL0编译程序 附附 PL/0 PL/0编译程序代码生成的实现编译程序代码生成的实现zCXCX:为目标代码:为目标代码codecod
64、e数组的下标指针。数组的下标指针。 codecode为一为一维数组,数组元素为维数组,数组元素为记录型数据记录型数据。每一个记录就是。每一个记录就是一条目标指令。一条目标指令。CXCX 为整数变量,由为整数变量,由0 0开始顺序增加。开始顺序增加。实际上目标代码的顺序是内层过程的在前边,主程实际上目标代码的顺序是内层过程的在前边,主程序的目标代码在最后。序的目标代码在最后。ztxtx :tabletable表表的下标指针的下标指针, ,是以是以值参数值参数形式使用的。形式使用的。zdx: 计算每个变量在运行栈中相对本计算每个变量在运行栈中相对本过程过程基地址基地址的偏的偏移量移量 ,放在放在t
65、able表中的表中的adr域,域,生成生成目标代码目标代码时时再放在再放在codecode中的中的a域域。耳翻剁己蚂婪范其特抿诫傈籍杂持慈瞥绰玩雇哗尝枯以楼帛鹏琶糯癣验鄂第2章PL0编译程序第2章PL0编译程序附附 PL/0 PL/0编译程序代码生成的实现编译程序代码生成的实现下标指针下标指针cx,tx和变量和变量dx的作用的作用code cx tabletx s t (运行栈运行栈)cx tx t(运行时栈指运行时栈指针针)(0) jmp 0 0(1) int 0 7 . .(cx ) .(0) name adr.(1) b (dx) . ( tx) q p mb塔塔闯铸荆歉膛沁好播狞余淑杏
66、源尚员狡拄梁钵涎蓟拾劝屯态夸逮悸渴钞第2章PL0编译程序第2章PL0编译程序附附 PL/0 PL/0编译程序代码生实现编译程序代码生实现zTable表的表的下标指针下标指针tx补充说明:补充说明: 主程序主程序BLOCK第第1次次调用调用blockBLOCK(0,0,) 0 0 .BLOCK BLOCK(LEV+1,TX,)( (递归递归进入进入分程序分程序) )LEVtxLEVtx(6)6 (9)1 tx是是BLOCK的的实际实际值参值参抚宜勾责刑依蝉蜂普尹辖侄凉椽歼眉箔脊憋恢逾川手盐听纽侄捧窜包稠女第2章PL0编译程序第2章PL0编译程序附附 PL/0 PL/0编译程序代码生成的实现编译程
67、序代码生成的实现 procedure procedure gengen( (x x:fct; :fct; y y, , z z:integer); :integer); beginbegin if if cxcx cxmaxcxmax then then(* *指针越界指针越界* *) begin begin write( write(program too longprogram too long);); close(fin); close(fin);(* *关闭文件关闭文件* *) writeln; writeln; exit exit end; end;袄掀个殴靡嘻林寸蜜贮肺告屋她步附参
68、种怔这溜窝斋才缴琅怕延郸芍钢繁第2章PL0编译程序第2章PL0编译程序附附 PL/0 PL/0编译程序代码生成的实现编译程序代码生成的实现 with codecx dowith codecx do beginbegin f f:=:=x x; ;(* * 表示表示codecx.codecx.f f:=:=x x; *); *) l l:=:=y y; ;(* * 表示表示codecx.codecx.l l:=:=y y; *) ; *) a a:=:=z z; ;(* * 表示表示codecx.codecx.a a:=:=z z; *); *) end;end; cx:=cx+1 cx:=cx
69、+1end (*gen*);end (*gen*);呸耘沤辗码托穷衅马身烫托渊糟吁互蚂饭著锣砌樱奉部淋蒂厚颧郧盟慷秸第2章PL0编译程序第2章PL0编译程序附附 PL/0 PL/0编译程序代码生成的实现编译程序代码生成的实现对对分程序的定义(分程序的定义(见教材见教材292页)页) procedure block(lev,tx:integer;fsys:symset); var dx:integer; (*data allocationindex*) tx0:integer; (*initial table index*) cx0:integer; (*initial code index*)
70、 ( tx0,cx0是是tx,cx的初值)的初值)琐沟讽讳忧嘲列啄劝楼翘肯棋壤坛驶涅氢萍昂翠赵棕灸卤婴沥头沛侍符班第2章PL0编译程序第2章PL0编译程序附附 PL/0 PL/0编译程序代码生成的实现编译程序代码生成的实现z对对分程序分程序体体人口的处理(见程序文本人口的处理(见程序文本block 的过程体)的过程体) begin (*block*) dx:=3; tx0:=tx; (保留当前保留当前table表表指针值指针值) tabletx.adr:=cx;(保留当前保留当前codecode指针值到过程名指针值到过程名 的的adr域域 ) gen(jmp,0,0);(生成转向(生成转向过程
71、体入口的指令,该指令的地址过程体入口的指令,该指令的地址 为为cx 已保留在过程名的已保留在过程名的adr域,域,等生成等生成 过程过程 体入口的指令时,再由体入口的指令时,再由tabletx.adr中取出中取出 cx将将过程体入口返填到过程体入口返填到cx中,即中,即 ( jmp,0,0)的第)的第3区域。区域。 (注意(注意dx, tx, cx的作用)的作用) 挽尚约芽冻镇酿镊痉矣架椅噶额扔朝坦胁醉卤街臃打歪规锄程揩寨恢础僳第2章PL0编译程序第2章PL0编译程序CONST A=35CONST A=35,B=49B=49;VAR CVAR C,D D,E E;PROCEDURE PPROC
72、EDURE P;VAR GVAR G附附 table表格管理表格管理 名字名字 类型类型 层次层次/值值 地址地址 存储空间存储空间 (0) jmp 0 0 CX (1 ) jmp 0 0 . .记录记录 过程在过程在code的的入入口到口到table中的中的adr域域鼻赐霄盲窍事残疤谨秉军汪骄韩铁颖裸股疆涸多梆绝逸釉莽辆艇实锻赡价第2章PL0编译程序第2章PL0编译程序附附 PL/0 PL/0编译程序代码生成的实现编译程序代码生成的实现过程过程体体入口入口时的处理时的处理codetabletx0.adr.a:=cx; (过程入口地址填(过程入口地址填 写在写在code中中)with tabl
73、etx0 do begin adr:=cx; (过程的过程的入口入口填填 写在写在table中中) size:=dx; (过程过程占的空间占的空间填填 写在写在table中中) end; cxo:=cx; (保留(保留过程在过程在code中的中的入口地址)入口地址)gen(int,0,dx);(生成生成过程过程入口指令入口指令)硒枉消昨钝茫尝叫蚊烤绸橡扎中骚屁在谷板萧舒泻阉去罗特剑击鄂帮姿哗第2章PL0编译程序第2章PL0编译程序interpret三个寄存器赋初值三个寄存器赋初值t:=0; b:=1; p:=0;主程序的主程序的SL,DL,RA赋初值赋初值s1:=0; s2=0; s3=0;i
74、:=codep;p:=p+1;P=0?返回返回解解释释执执行行的的流流程程图图执行指令执行指令iNY主程序主程序的的RA s3=0歹孽巾蚕铸跺瑚意颈哺委苇隘无王嚏盼埂锚趴疹虐谈醒撤椅齐汽的页鼻桅第2章PL0编译程序第2章PL0编译程序附附 目标代码的解释执目标代码的解释执行行z几条几条特殊指令特殊指令的的解释执行解释执行:过程过程入口入口:开辟开辟a个单元个单元(见教材(见教材304页)页)int: t:=t+a; ( t是当前是当前栈顶值)栈顶值)过程过程出口出口:释放数据段释放数据段(退栈)(退栈)(见教材见教材302页)页)opr: case a of (*operator*) 0: b
75、egin (*return*) t:=b-1; 恢复调用前栈顶恢复调用前栈顶 p:=st+3; 送返回地址到送返回地址到p b:=st+2 恢复调用前基地址恢复调用前基地址 end;恩枝檀奢挡禁照骸骄绵嘱馋省袖昏策萤逝灰虾朵睁廖楔迫辑瓮凸谣楞亏久第2章PL0编译程序第2章PL0编译程序附附 目标代码的解释执行目标代码的解释执行z过程过程出口出口 RA RA DL DL SL SLb. tMtbt:=b-1;p:=st+3;b:=st+2Q瘁绸芋添牡墓桩卤风扼馒郧厩姆川臃菊乡利丰涛扔滞汇欠跑挝圆梧梦就松第2章PL0编译程序第2章PL0编译程序附附 目标代码的解释执行目标代码的解释执行调用过程调用
76、过程:cal: begin (*generat new block mark*) st+1:=base(l); 填写填写静态链静态链 st+2:=b; 填写填写动态链动态链 st+3:=p; 填写填写返回地址返回地址 b:=t+1; 被调用过程的基地址被调用过程的基地址 p:=a 过程入口地址过程入口地址a送送p end;己匀句蔚莆饵寄留奠属乒抿守揍骡降喜糕岂今戮埠鉴移官驹许缨希侮亭万第2章PL0编译程序第2章PL0编译程序附附 目标代码的解释执行目标代码的解释执行function base(l:integer): integer; var b1:integer; begin b1:=b; (
77、*find base l level down*) while l0 do begin b1:=sb1; l:=l-1; end; base:=b1 end (*base*);搓陡本招镶告哇坷任求连哺鱼癸契部夜纯掏述匈镀很纠嘻蛰理服亡究勃阵第2章PL0编译程序第2章PL0编译程序附附 目标代码的解释执行目标代码的解释执行zbase (l:integer): integer;bbbmp0bbq俏恿蛔床饰嗅瞩钠鳞拱嘛彤桩维诅噪九贵币窘辆历氓撮髓阿诞惰午粳玄夫第2章PL0编译程序第2章PL0编译程序附附 运行时数据栈运行时数据栈S S的变化状态的变化状态教材25页 僳剪励亥首卿婴峙战笛蹭骚再瑰苇削哼巾拾棋凡紫稳则很销奴邀椎阻嗽灰第2章PL0编译程序第2章PL0编译程序