[理学]PL/0编译器的实现文档.doc
《[理学]PL/0编译器的实现文档.doc》由会员分享,可在线阅读,更多相关《[理学]PL/0编译器的实现文档.doc(35页珍藏版)》请在三一办公上搜索。
1、第二章 PL/0编译程序的实现【课前思考】复习第1章介绍的一个高级程序设计语言编译程序的功能和实现的步骤。编译程序就是一个语言的翻译程序,通常是把一种高级程序设计语言(称源语言)书写的程序翻译成另一种等价功能语言(称目标语言)的程序。换句话说,编译是指把一种用源语言表示的算法转换到另一种等价的用目标语言表示的算法。编译程序实现的必要步骤有词法、语法、语义分析和代码生成。此外必需有符号表管理程序和出错处理程序。本章介绍的PL/0编译程序的实现是用PASCAL语言书写的【学习目标】本章目的:以PL/0语言编译程序为实例,学习编译程序实现的基本步骤和相关技术,对编译程序的构造和实现得到一些感性认识和
2、建立起整体概念,为后面的原理学习打下基础。 了解并掌握用语法图和扩充的巴科斯-瑙尔范式(EBNF)对 PL/0语言的形式描述。 了解并掌握PL/0语言编译程序构造和实现的基本技术和步骤。 了解并掌握PL/0语言编译程序的目标程序在运行时数据空间的组织管理。【学习指南】 要求读者阅读PL/0语言编译程序文本,了解一个编译程序构造的必要步骤和实现技术。一个编译程序的实现比较复杂,读懂一个典型的程序从设计思想到实现技术也有一定难度,特别是入门开始需要耐心。一但读懂,不仅了解编译程序的实现方法和技术,还可学到许多编程技巧和好的编程风格。 阅读PL/0语言编译程序文本时,应从整体结构开始逐步细化,弄清楚
3、每个过程的功能和实现方法及过程之间的相互关系。 建议用一个PL/0源程序的例子为导引作为阅读PL/0语言编译程序文本的入门,然后再逐步全面读懂。 通过对PL/0语言编译程序某些指定功能的扩充,加深对编译程序构造步骤和实现技术的理解,并能在实践中应用。 【难 重 点】重点: 弄清源语言(PL/0)、目标语言(类pcode)与实现语言(C)这3个语言之间的关系和作用。 掌握用语法图和扩充的巴科斯-瑙尔范式(EBNF)对一个高级程序设计语言的形式描述。 了解PL/0语言编译程序的语法分析技术采用的是自顶向下递归子程序法。 掌握PL/0语言编译程序的整体结构和实现步骤,并弄清词法分析、语法分析、语义分
4、析、代码生成及符号表管理每个过程的功能和相互联系。 掌握PL/0语言编译程序的目标程序在运行时采用栈式动态存储管理的实现技术。难点: 符号表管理起着编译期间和目标程序运行时信息联系的纽带,符号表的建立并不困难,但信息之间的关系往往需要反复学习才能理解。【知识结构】 为了使读者在系统地学习本教材以下各章节之前,对编译程序的构造得到一些感性认识和初步了解,本章推荐了世界著名计算机科学家N.Wirth编写的PL/0语言的编译程序,并对其实现过程作了概括的分析说明,作为读者阅读PL/0语言编译程序文本的提示。对PL/0语言文法的表示只给出语法图和扩充的巴科斯-瑙尔范式(EBNF)的描述形式,不作文法理
5、论上的讨论。由于PL/0语言功能简单、结构清晰、可读性强,而又具备了一般高级语言的必须部分,因而PL/0语言的编译程序能充分体现一个高级语言编译程序实现的基本技术和步骤。因此,PL/0语言编译程序是一个非常合适的小型编译程序的教学模型。所以,阅读PL/0语言编译程序文本后,可帮助读者对编译程序的实现建立起整体概念。 2.1 PL/0语言和类pcode的描述 在上一章中已介绍过,编译程序的功能是把一种高级程序设计语言的程序翻译成某种等价功能的低级语言的程序。PL/0语言的编译程序就是要把PL/0语言程序翻译成为一种称为类pcode的假想的栈式计算机汇编语言程序。这种汇编语言与机器无关,若需要在某
6、一机器上实现PL/0语言程序,只需用机器上配置的任何语言对类pcode语言程序进行解释执行。那么PL/0语言是什么样的语言?类pcode语言又是什么样的结构?它们之间是如何映射的?只有在明确了这些问题之后,才能确定如何构造这个翻译程序。 就像一个翻译要把汉语翻译成英语,必须对汉语和英语的单词、语法结构都很精通,才有可能翻译得准确无误。另外,编译程序既然是为了完成这种功能的一个程序,就存在用什么语言来编写这个程序的问题。这些问题在本节将逐步介绍。现对PL/0语言编译程序的功能用“T”型图(“T”型图将在第13章详细介绍)表示,并用图形概括描述PL/0编译程序的结构框架。本节将用语法图和扩充的巴科
7、斯-瑙尔范式(BACKUS-NAUR FORM)(EBNF)两种形式给出PL/0语言的语法描述。对类pcode代码给出指令的结构形式和含义。 巴科斯-瑙尔范式(BACKUS-NAUR FORM)是根据美国的John W.Backus与丹麦的Peter Naur命名的。2.1.1 PL/0语言的语法描述图 用语法图描述语法规则的优点是直观、易读。在图2.1的语法图中用椭圆和圆圈中的英文字表示终结符,用长方形内的中文字表示非终结符。所谓终结符,是构成语言文法的单词,是语法成分的最小单位,而每个非终结符也是一个语法成分。但非终结符可由其它文法符号定义,终结符不能由其它文法符号定义。例如,程序是由非终
8、结符分程序和终结符.组成的串定义的。由于对某些非终结符可以递归定义,如图2.1(b)、2.1 (c)、2.1 (e)中:分程序、表达式和语句。第一个非终结符 程序为文法的开始符号。注意在书写语言程序时非终结符并不出现,程序是由终结符串构成。 图 2.1(a) 程序语法描述图图 2.1(b) 分程序语法描述图图2.1(c) 语句语法描述图图 2.1(d) 条件语法描述图图 2.1(e) 表达式语法描述图图 2.1(f) 项语法描述图图 2.1(g) 因子语法描述图画语法图时要注意箭头方向和弧度,语法图中应该无直角,如图 2.1给出的PL/0语法描述图。沿语法图分析时不能走尖狐线。 2.1.2 P
9、L/0语言文法的EBNF表示 EBNF表示的符号说明。 :用左右尖括号括起来的中文字表示语法构造成分,或称语法单位,为非终结符。= :该符号的左部由右部定义,可读作定义为。| :表示或,为左部可由多个右部定义。 :花括号表示其内的语法成分可以重复。在不加上下界时可重复0到任意次数,有上下界时为可重复次数的限制。如:*表示*重复任意次,*38表示*重复3-8次。 :方括号表示其内的成分为任选项。( ) :表示圆括号内的成分优先。例:用EBNF描述文法的定义 :=+|-=0|1|2|3|4|5|6|7|8|9或更好的写法=+|-|0=1|2|3|4|5|6|7|8|9 =0| PL/0语言文法的E
10、BNF表示为:程序=分程序分程序=常量说明部分变量说明部分过程说明部分语句常量说明部分=CONST常量定义 ,常量定义;常量定义=标识符=无符号整数无符号整数=数字数字变量说明部分=VAR标识符,标识符;标识符=字母字母|数字过程说明部分=过程首部分程序;过程说明部分;过程首部=PROCEDURE标识符;语句=赋值语句|条件语句|当型循环语句|过程调用语句|读语句|写语句|复合语句|空赋值语句=标识符=表达式复合语句=BEGIN语句;语句END条件=表达式关系运算符表达式|ODD表达式表达式=+|-项加法运算符项 项=因子乘法运算符因子因子=标识符|无符号整数|(表达式)加法运算符=+|-乘法
11、运算符=*|/关系运算符=#|=|=|=条件语句=IF条件THEN语句过程调用语句=CALL标识符当型循环语句=WHILE条件DO语句读语句=READ(标识符,标识符)写语句=WRITE(表达式,表达式)字母=a|b|X|Y|Z数字=0|1|2|8|9用语法图描述语言的语法与EBNF描述相比较:语法图描述: 直观,易读,易写。EBNF表示:形式化强,易机器识别。无论用语法图或EBNF作为描述程序设计语言语法的工具,对描述的语法可以检查哪些符号序列是所给语言的合法程序,一个程序设计语言如C或JAVA,用户可用它写出成千上万个不同的程序,但C或JAVA它们各自的语法只有一个,这就使得无穷的句子集可
12、用有穷的文法(语法)描述。练习:下面给出一个PL/0语言的程序,请学员对应PL/0语言的语法描述图与EBNF ,检查该程序的语法是否正确。 CONST A=10;VAR B,C;PROCEDURE P;VAR D;PROCEDURE Q;VAR X;BEGINREAD(X);D:= D* C +X; WRITE(D);WHILE X#0 DO CALL P;END;BEGINREAD(D, C);CALL Q;END;BEGINCALL P;END. PL/0编译程序的使用限制 标识符的有效长度是10 数字最多为14位 过程最多可嵌套三层,可递归调用 标识符的作用域同PASCAL,内层可引用包
13、围它的外层定义的标识符(如:变量名,过程名,常量名) 2.1.3 类pcode代码指令的结构 PL/0编译程序所产生的目标代码是一个假想栈式计算机的汇编语言,可称为类PCODE指令代码,它不依赖任何具体计算机,其指令集极为简单,指令格式也很单纯,其格式如下:fla其中f代表功能码,l表示层次差,也就是变量或过程被引用的分程序与说明该变量或过程的分程序之间的层次差。a的含意对不同的指令有所区别,对存取指令表示位移量,而对其它的指令则分别有不同的含义,见下面对每条指令的解释说明。 目标指令有8条: LIT:将常量值取到运行栈顶。a域为常数值。 LOD:将变量放到栈顶。a域为变量在所说明层中的相对位
14、置,l为调用层与说明层的层差值。 STO:将栈顶的内容送入某变量单元中。a,l域的含意同LOD指令。 CAL:调用过程的指令。a为被调用过程的目标程序入口地址,l为层差。 INT:为被调用的过程(或主程序)在运行栈中开辟数据区。a域为开辟的单元个数。 JMP:无条件转移指令,a为转向地址。 JPC:条件转移指令,当栈顶的布尔值为非真时,转向a域的地址,否则顺序执行。 OPR:关系运算和算术运算指令。将栈顶和次栈顶的内容进行运算,结果存放在次栈顶,此外还可以是读写等特殊功能的指令,具体操作由a域值给出。(详见解释执行程序)。类pcode代码指令的详细解释(指令功能表) 认识目标代码类pcode
15、目标代码类pcode是一种假想栈式计算机的汇编语言。指令格式:flaf 功能码l 层次差 (标识符引用层减去定义层)a 根据不同的指令有所区别指令功能表LIT 0 a将常数值取到栈顶,a为常数值LOD l a将变量值取到栈顶,a为偏移量,l为层差STO l a将栈顶内容送入某变量单元中,a为偏移量,l为层差CAL l a调用过程,a为过程地址,l为层差INT 0 a在运行栈中为被调用的过程开辟a个单元的数据区JMP 0 a无条件跳转至a地址JPC 0 a条件跳转,当栈顶布尔值非真则跳转至a地址,否则顺序执行OPR 0 0过程调用结束后,返回调用点并退栈OPR 0 1栈顶元素取反OPR 0 2次
16、栈顶与栈顶相加,退两个栈元素,结果值进栈OPR 0 3次栈顶减去栈顶,退两个栈元素,结果值进栈OPR 0 4次栈顶乘以栈顶,退两个栈元素,结果值进栈OPR 0 5次栈顶除以栈顶,退两个栈元素,结果值进栈OPR 0 6栈顶元素的奇偶判断,结果值在栈顶OPR 0 7OPR 0 8次栈顶与栈顶是否相等,退两个栈元素,结果值进栈OPR 0 9次栈顶与栈顶是否不等,退两个栈元素,结果值进栈OPR 0 10次栈顶是否小于栈顶,退两个栈元素,结果值进栈OPR 0 11次栈顶是否大于等于栈顶,退两个栈元素,结果值进栈OPR 0 12次栈顶是否大于栈顶,退两个栈元素,结果值进栈OPR 0 13次栈顶是否小于等于
17、栈顶,退两个栈元素,结果值进栈OPR 0 14栈顶值输出至屏幕OPR 0 15 屏幕输出换行OPR 0 16从命令行读入一个输入置于栈顶一个PL/0程序与目标代码类pcode指令的映射例子:2.2 PL/0编译程序的结构 由2.1节可知,PL/0语言可看成是PASCAL语言的子集,它的编译程序是一个编译解释执行系统。PL/0的目标程序为假想栈式计算机的汇编语言,与具体计算机无关。PL/0的编译程序和目标程序的解释执行程序都是用PASCAL语言书写的,因此PL/0语言可在配备PASCAL语言的任何机器上实现。其编译过程采用一趟扫描方式,以语法分析程序为核心,词法分析程序和代码生成程序都作为一个独
18、立的过程,当语法分析需要读单词时就调用词法分析程序,而当语法分析正确需生成相应的目标代码时,则调用代码生成程序。此外,用表格管理程序建立变量、常量和过程标识符的说明与引用之间的信息联系。用出错处理程序对词法和语法分析遇到的错误给出在源程序中出错的位置和错误性质。当源程序编译正确时,PL/0编译程序自动调用解释执行程序,对目标代码进行解释执行,并按用户程序要求输入数据和输出运行结果。其编译和解释执行的结构图如图2.2(a)和2.2(b)所示。PL/0的编译程序和目标程序的解释执行程序都是用PASCAL语言书写的,因此PL/0语言可在配置有PASCAL语言的任何机器上实现。读者也可用其它语言改写P
19、L/0编译程序,也可以用另一种语言编写目标代码类pcode的解释执行程序。PL/0编译程序的编译过程是按源程序顺序进行分析的,常量变量说明部分不产生目标代码。 图 2.2(a) PL/0编译程序的结构图 图 2.2(b) PL/0的解释执行结构 PL/0编译程序是用PASCAL语言书写的,整个编译程序(包括主程序)是由18个嵌套及并列的过程或函数组成,下面分别简要给出这些函数的功能及它们的层次结构。这些过程或函数的嵌套定义层次结构如图2.3所示。 图 2.3 PL/0编译程序过程与函数定义层次结构图 由于PL/0编译程序采用一趟扫描方法,所以语法分析过程BLOCK是整个编译过程的核心。下面我们
20、将在图2.4中先给出编译程序的总体流程,以弄清BLOCK过程在整个编译程序中的作用。在流程图2.4中可以看出,主程序置初值后先调用读单词过程GETSYM取一个单词,然后再调用语法分析过程BLOCK,直到遇源程序的结束符为止。 语法分析过程BLOCK是整个编译过程的核心,是指开始由主程序调用GETSYM取一个单词,再调用语法分析过程BLOCK, BLOCK由当前单词根据语法规则再调用其它过程,如说明处理、代码生成或出错处理等过程进行分析,当分析完一个单词后,BLOCK再调用GETSYM取下一个单词,一直重复到当前单词为结束符表明源程序已分析结束。若未取到结束符,而源程序已没有输入符号,这时表明源
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 理学 PL 编译器 实现 文档
链接地址:https://www.31ppt.com/p-4543633.html