PL编译程序的实现.ppt

上传人:牧羊曲112 文档编号:6514885 上传时间:2023-11-08 格式:PPT 页数:43 大小:335.49KB
返回 下载 相关 举报
PL编译程序的实现.ppt_第1页
第1页 / 共43页
PL编译程序的实现.ppt_第2页
第2页 / 共43页
PL编译程序的实现.ppt_第3页
第3页 / 共43页
PL编译程序的实现.ppt_第4页
第4页 / 共43页
PL编译程序的实现.ppt_第5页
第5页 / 共43页
点击查看更多>>
资源描述

《PL编译程序的实现.ppt》由会员分享,可在线阅读,更多相关《PL编译程序的实现.ppt(43页珍藏版)》请在三一办公上搜索。

1、第二章 PL/0编译程序的实现,学习目标:以PL/0语言为例对编译程序的构造得到感性认识和初步了解,对编译程序的实现建立起整体概念。,2.1PL/0语言2.2PL/0编译程序的结构2.3PL/0编译程序的词法分析2.4PL/0编译程序的语法、语义分析2.5PL/0编译程序的目标程序结构和代码生成2.6PL/0编译程序的语法错误处理,2.1 PL/0语言,1 PL/0程序示例2 PL/0的语言的描述3PL/0语言:PASCAL语言的子集,1 PL/0程序示例,const A=10;(*常量说明部分*)var B,C;(*变量说明部分*)procedure P;(*过程说明部分*)begincal

2、l P;(*主程序体*)end.,var D;(*过程P的分程序*)procedure Q;(*嵌套的Q过程定义*)var X;begin(*Q的过程体*)read(X);D:=X;while X#0 do call P;end;beginwrite(D);call Q;(*P的过程体*)end;,2 PL/0的语言的描述,PL/0语言语法的描述工具是文法:文法:使得无穷的句子集可以用有穷的规则来描述的工具终结符:构成文法的单词,是语法成分的最小单位非终结符:是一个语法成分,在书写语言程序时并不存在,由终结符和非终结符串或终结符串定义的。文法开始符:通常称第一个非终结符为文法开始符号文法的描述

3、形式:语法图和EBNF,2.1.1 PL/0语言的语法描述图,2.1.2 PL/0语言文法的EBNF表示,BNF与EBNF的介绍BNF(BACKUS-NAUR FORM)是根据美国的John W.Backus与丹麦的Peter Naur来命名的。可以理解为描述程序设计语言语法的语言。采用BNF可说明哪些符号序列是语法上正确的程序。,BNF与EBNF表示的符号说明BNF引入的符号:用左右尖括号括起来的语法成分为非终结符=该符号的左部由右部定义|或EBNF引入的符号:表示花括号内的语法成分可重复 表示方括号内的语法成分为任选项()表示圆括号内的成分优先,例子:用EBNF描述:整数:=+|-=0|1

4、|2|3|4|5|6|7|8|9不允许以0开头的整数=+|-|0=1|2|3|4|5|6|7|8|9=0|1|2|3|4|5|6|7|8|9,PL/0语言文法的EBNF表示为:=.:=:=CONST,;:=:=VAR,;,:=;:=PROCEDURE;:=|,3 PL/0语言:PASCAL语言的子集,PL/0与PASCAL相同的地方作用域规则:内层可引用包围它的外层定义的标识符,同一层并列过程的调用关系是先定义的可以被后定义的引用。过程可以嵌套定义,可递归调用PL/0是PASCAL的子集,2.2 PL/0编译程序的结构,编译过程采用一遍扫描方式,以语法分析程序为核心,词法分析程序和代码生成程序

5、都作为一个独立的过程。,目标代码为汇编语言,建立变量,常量和过程标识符的说明与引用之间的信息联系,对词法和语法分析遇到的错误给出错误位置和错误性质,2.3 PL/0编译程序的词法分析,词法分析程序GETSYM功能:为语法分析提供单词,它把输入的字符串形式的源程序分割成一个个单词符号。,单词的种类基本字:也称保留字,如begin,end,var等运算符:如+、-、*、/、:=、#、=、=等标识符:字母打头的字母/数字串:包括用户定义变量名、常数名、过程名整常数:数字打头的数字串:如10,89等整数界符:“,”,“(”,“)”等,词法分析完成的任务:滤空格识别保留字识别标识符拼数拼复合词(即两个字

6、符组成的算符)例如当遇到字符:时,它可能是复合单词:=中的:,因此要向前看一个字符输出源程序,词法分析程序的设计-使用状态转换图,词法分析过程GETSYM所用单元说明:CH:存放当前读取的字符,初值为空。每当读一个新单词时其第一字符已在CH中,每当处理完一个单词时,其后继符已被读到了CH中。GETCH:取字符过程,由词法分析需要取字符时调用SYM:存放每个单词的类别,用内部编码形式表示ID:存放用户定义的标识符的值NUM:存放用户定义的数A:一维数组,数组元素为字符,界对1:10,GETSYM,CH=空?,GETCH,Y,N,CH是字母?,Y,N,K:=0,CH是数字?,K10?,K:=K+1

7、Ak:=CH,GETCH,Y,N,CH是字母或数字?,Y,ID:=A,N,ID是否是保留字?,Y,N,拼数,将拼数后的值送NUMSYM:=NUMBER,把该字符转换成对应单词,或拼复合单词,将其类别送SYM中,N,Y,SYM:=IDENT,保留字类别送SYM,返回,词法分析过程GETSYM,2.4 PL/0编译程序的语法、语义分析,语法分析语义分析,PL/0编译程序语法分析的设计,任务:识别由词法分析给出的单词符号序列是否符合给定的文法规则。,方法:自顶向下的递归子程序法,以语法图为依据对每个非终结符,编一个独立的处理过程;语法分析从读入第一个单词开始,由文法开始符出发,沿语法描述图的箭头所指

8、出的方向进行分析;当遇到非终结符时,调用相应的处理过程当遇到终结符时,则判断当前读入单词是否与图中的终结符相匹配,以表达式的语法分析为例说明递归子程序法,表达式的递归子程序实现:Procedure expr;Begin if sym in plus,minus then begin getsym;term;end else term;while sym in plus,minus do begin getsym;term;endEnd;,项的递归子程序实现:Prodecure term;Beginfactor;while sym in times,slash do begin getsym;f

9、actor;endend;,Procedure factor;因子的递归子程序实现Begin if symident then begin if symnumber thenbegin if sym=(then begin getsym;expr;if sym=)then getsym else error end else errorendendend.,在递归子程序法中,当遇到分支点时候,将当前的单词与分支点上的多个终结符逐个相比较,若都不匹配时可能是进入下一个非终结符语法单位或出错。,递归子程序法的分析结果:如果一个单词序列在整个语法分析中,都能逐个得到匹配,直到程序结束符.,这时就说所

10、输入的程序是正确的。,程序,分程序,语句,条件,表达式,项,因子,语法调用关系图,PL/0编译程序语义分析的设计,说明部分的分析过程体(语句)的分析,consta=10;var b,c;procedure p;bebinc:=b+aend;beginread(b);while b#0 dobegincall p;write(2*c);read(b)endend.,说明部分,过程体,说明部分的语义分析,构造符号表,对每个过程(含主过程)说明的对象(变量、常量和过程),在符号表中登记标识符的属性,包括:种类所在层次(主程序为第0层,主程序定义的过程为第1层,随着嵌套深度增加而层次数加大)值分配的相

11、对位置等,过程的说明部分:CONST A=35,B=49;VAR C,D,E;PROCEDURE P;VAR G,TABLE表中的信息,变量相对本过程基地址的偏移量,过程体的语义分析,当遇到标识符的引用时,就查符号表,看是否有过正确定义,若已有,则从表中取相应的属性,供代码生成使用,若无则报错,当语义正确时,就生成相应的目标代码,2.5 PL/0编译程序的目标代码结构和代码生成,目标代码:一个假想的栈式计算机的汇编语言,不依赖任何实际计算机,指令功能表,源程序consta=10;varb,c;procedure p;bebin c:=b+aend;,begin(*主程序体部分*)read(b)

12、;while b#0dobegincall p;write(2*c);read(b);endend.,(2)int0 3 过程p的入口,为过程P开辟空间(3)lod13取变量b的值到栈顶(4)lit010取常量10到栈顶(5)opr02次栈顶和栈顶相加(6)sto14栈顶值送变量c中(7)opr00退栈并返回调用点,过程P对应的目标程序:过程体语句是c:=b+a,(8)int05主程序入口开辟5个栈空间read(b);的代码(9)opr016 从命令行读入值置于栈顶(10)sto03将栈顶值存入变量b中while b#0do的代码(11)lod03将变量b的值取至栈顶(12)lit00将常量值

13、0进栈(13)opr09次栈顶与栈顶是否不等(14)jpc024等时转(24)(条件不满足转),call p;的代码(15)cal02调用过程pwrite(2*c);的代码(16)lit02常数2进栈(17)lod04将变量c的值取至栈顶(18)opr04次栈顶与栈顶相乘(2*c)(19)opr014栈顶值输出至屏幕(20)opr015换行,read(b);(21)opr016从命令行读取值到栈顶(22)sto03栈顶值送变量b中(23)jmp011无条件转到循环入口(11)(24)opr00结束退栈,1、在以上代码之前有(0)jmp 0 8/8为主程序入口(1)jmp 0 2/2为过程P入口2、每个过程调用前,都在栈顶 分配3个单元,地址为02,分别指向定义和调用该过程的过程与返回地址3、在P中(3)lod 1 3/取外层变量b的值到栈顶;在主程序(11)lod 0 3/将本层定义的变量b的值取至栈顶,2.6 PL/0编译程序的语法错误处理,常见的语法错误:程序的开始单词错,表达式的开始单词错,语句的开始单词错,表达式的后继单词错,语句的后继单词错等等标识符和常量单词错:如在const,var,procedure等保留字后面不是标识符,常量说明中=后不是数字括号类错误:如beginend不配对,ifelse不配对分隔符错:如赋值语句左部变量后不是赋值号等,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号