资源描述:
《cha2 pl0编译程序的实现ppt课件.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第二章PL/0编译程序的实现引言2.1PL/0语言描述(掌握)2.2PL/0编译程序的结构(理解)2.3+2.4PL/0编译程序的词法+语法语义分析(了解)2.5PL/0编译程序的目标代码结构和代码生成(掌握)2.6PL/0编译程序的语法错误处理(了解)2.7PL/0编译程序的目标代码解释执行时的存储分配描述(掌握)本章练习作业课程目录1引言本章目的以PL/0编译程序为实例,学习编译程序实现的基本步骤和相关技术PL/0编译程序PL/0编译程序PL/0语言程序源语言(PL/0)目标语言(类pcode)实现语言(C或pascal)
2、PL/0类pcodeC或pascal类pcode代吗22.1PL/0语言描述PL/0程序示例2.1.1PL/0的语法描述图2.1.2PL/0语言的EBNF表示PL/0语言:PASCAL语言的子集3PL/0程序示例CONSTA=10;(*常量说明部分*)VARB,C;(*变量说明部分*)PROCEDUREP;(*过程说明部分*)VARD;(*P的局部变量说明部分*)PROCEDUREQ;(*P的局部过程说明部分*)VARX;BEGINREAD(X);D:=X;WHILEX#0DOCALLP;END;BEGINWRITE(D
3、);CALLQ;END;BEGINCALLP;END.Q过程体p过程体主程序体42.1.1PL/0语言的语法描述图p13程序分程序.内的文字表示非终结符或内的文字或符号表示终结符每个语法单位对应一个语法描述图一个入口和一个出口的有向图,从入口可到达任何节点,每个节点都可以到达出口从入口到出口的路径表示该语法单位的一种合法中间形式(短语)有两种类型的节点5constidentnumber=,;varident,;;procedureident;分程序语句分程序62.1.2PL/0语言的EBNF表示p15EBNF的元符号:
4、<>用左右尖括号括起来的内容为非终结符∷=读做‘定义为’∷=的左部由右部定义→读做‘定义为’→的左部由右部定义
5、读做‘或’表示右部候选内容{}表示花括号内的内容可重复任意次或限定次数[]表示方括号内的内容为任选项()表示圆括号内的内容优先7用EBNF描述整数用EBNF描述<无符号整数>的定义:<无符号整数>∷=<数字>{<数字>}<数字>∷=0
6、1
7、2
8、3
9、4
10、5
11、6
12、7
13、8
14、9问题:无正负号用EBNF描述<整数>的定义:<整数>∷=[+
15、-]<数字>{<数字>}<数字>∷=0
16、1
17、2
18、3
19、4
20、5
21、6
22、7
23、8
24、9问题:允许0开
25、头用EBNF描述<整数>(不能用0开头)的定义:<整数>∷=[+
26、-]<非零数字>{<数字>}
27、0<非零数字>∷=1
28、2
29、3
30、4
31、5
32、6
33、7
34、8
35、9<数字>∷=0
36、<非零数字>8用EBNF描述PL/0片段<程序>::=<分程序>.<分程序>::=[<常量说明部分>][<变量说明部分>][<过程说明部分>]<语句><常量说明部分>::=CONST<常量定义>{,<常量定义>};<常量定义>::=<标识符>=<无符号整数><无符号整数>::=<数字>{<数字>}<变量说明部分>::=VAR<标识符>{,<标识符>};<标识符>::
37、=<字母>{<字母>
38、<数字>}<过程说明部分>::=<过程首部><分程序>{;<过程说明部分>};<过程首部>::=PROCEDURE<标识符>;……9PL/0程序示例varn,fact,sum;{递归计算fact=m!}procedurefac;varm;beginfact:=1;m:=1;whilem<=ndobeginfact:=fact*m;sum:=sum+fact;m:=m+1;end;end;begin{读入n}read(n);sum:=0;ifn>0thencallfac;write(sum);end.请计算
39、sum=1!+2!+...+n!,(n从控制台读入)10PL/0语言是PASCAL语言的子集同PASCAL作用域规则(内层可引用包围它的外层定义的标识符),上下文约束,过程可嵌套定义,可递归调用子集数据类型,只有整型数据结构,只有简变和常数数字最多为14位标识符的有效长度是10语句种类过程最多可嵌套三层11CONSTA=35,B=49;VARC,D,E;PROCEDUREP;VARG,X,Y,Z;例:右边程序的说明部分分析后的符号表如下所示:符号表结构p21NAMEKIDEVAL(LEVEL)ADRSIZEACONSTANT3
40、5BCONSTANT49CVARIABLELEVDX(C的偏移量)DVARIABLELEVDX+1EVARIABLELEVDX+2PPROCEDURELEV过程入口代码7GVARIABLELEV+1DXXVARIABLELEV+1DX+1YVARIABLELEV+1DX+2Z