实验环境:
1. 操作系统为Windows 2000或Dos6.2以上 2. 应用软件为Pascal或C语言
本实验预备知识:
语法分析的任务,是识别由词法分析给出的单词符号序列结构上是否符合给定的文法规则。文法规则可用语法定义给出。
用语法描述图表示文法规则的优点是直观、易读。语法描述图中用椭圆和圆圈中的英文字,表示终结符用长方形内的中文字表示非终结符。所谓终结符,是构成语言
文法的单词,是语法成分的最小单位。而每个非终结符是一个语法成分,在书写语言程序时并不出现,它由终结符和非终结符串、或终结符串定义的。例如:程序是由非终结符'分程序'和终结符"."这个串定义的。由于对某些非终结符可以递归定义,如:图中分程序、表达式、语句,这就使得无穷的句子集可用有穷的文法描
编译原理实验指导
述。而对于第一个非终结符如'程序'不能出现在对非终结符的定义部分,通常称这样的符号为开始符。
PL/0语言编译程序的语法分析是采用了自顶向下的递归子程序法。粗略地说:就是对应每个非终结符语法单元编一个独立的处理过程(或子过程)。语法分析从读入第一个单词由非终结符'程序'即开始符出发,沿语法描述图箭头所指出的方向进行分析。当遇到非终结符时,则调用相应的处理过程,从语法描述图看也就进入了一个语法单元,再沿当前所进入的语法描述图的箭头方向进行分析,则执行相应的语义程序(就是翻译程序)。再读取下一个单词继续分析。遇到分支点时将当前的单词与分支点上的多个终结符逐个相比,若都有不匹配时可能是进入下一非终结符语法单位或是出错。如果一个PL/0语言的单词序列在整个语法分析中,都能逐个得到匹配,并正确,直到程序结束符".",这时就说所输入的程序是正确的。对于正确的语法分析做相应的语义翻译,最终得出目标程序。 过程BLOCK说明:
过程BLOCK的工作又可分为两步。
1. 说明部分的处理
由于PL/0语言允许过程调用语句,且允许过程嵌套定义。因此每个过程应有过程首部以定义局部于它自己定义的内过程引用。对于同一层过程的调用关系是先定义的可以被子后定义的引用,反之则不行。 说明部分的处理任务就是对每个过程(包括主程序,也可看成是一个主过程)的说明对象造名字表。填写所在层次(主程序为第0层,主程序定义的过程为第1层,随着嵌套的深度增加而层次数加大。PL/0最多允许3层),标识符的属性和分配的相对位置等。标识符的属性不同时,所需要填的信息也不同。 所造表放在全程量一维数组TABEL表中。TX为索引表的指针,表中的每个元素为记录型数据,LEV给出层次,DX给出每层局部量当前已分配到相对位置,可称地址指示器,每说明完一个变量后DX指示器加1。 例如:一个过程的说明部分为: CONST A=35,B=49; VAR C,D,E; PROCEDURE P;
VAR G
例题中说明处理后TABEL表中的信息对于过程名的ADR域,是在过程体的目标代码生成后反填过程体的入口地址。例中处理P过程的说明对LEV就增加1。在P过程中的变量名的层次为LEV+1后的值.至于造表和查表的过程中,如何保证每个过程的局部量不能被它的外层引用,请同学们看完程序后自己总结。
TABEL表的表头索引TX和层次单元LEV都以BLOCK的参数形式出现.在主程序调用BLOCK时实参值都为0.每个过程中变量的相对起始位置在BLOCK内置初值DX:=3。
2. 语句处理和代码生成
程序和主体是由语句构成的.处理完过程的说明后就处理由语句组成的过程体,从语法上要对语句逐句分析。当语法正确时就生成相应语句功能的目标代码。当遇到标
编译原理实验指导
识符的引用时就查TABEL表,看是否有过正确的定义,若已有,则从表中取相应的有关信息,供代码的生成用。PL/0语言的代码生成是由过程GEN完成的。GEN过程有三个参数,分别代表目标代码的功能码、层差、和位移量。生成的代码顺序放在数组CODE中。CODE为一维数组,数组元素为记录型数据.每一个记录就是一条目标指令。CX为指令的指针,由0开始顺序增加。 PL/0语言的目标指令的格式:
其中f代表功能码,l层次差,a:位移量。 目标指令有8条:
① LIT:将常量放到运行栈顶.a域为常数。 ② LOD:将变量放到栈顶.a域为变量在所说明层中的相应位置,l为调用层与说明层的层差值。 ③ STO:将栈顶的内容送入某变量单元中,a,l域的含意同LOD。 ④ CAL:调用过程的指令.a为被调用过程的目标程序入口地址,l为层差。 ⑤ INT:为被调用的过程(或主程序)在运行栈中开辟数据区.a域为开辟的个数。 ⑥ JMP:无条件转移指令,a为转向地址。 ⑦ JPC无条件转移指令,当栈顶的布尔值为非真时,转向a域的地址,否则顺序执行。 ⑧ OPR:关系和算术运算.具体操作由a域给出.运算对象为栈顶和次栈顶的内容进行运算,结果存放在次栈顶,或是其他特殊功能的操作。
编译原理实验指导
综合实验
实验三 扩展功能的PL/O编译程序
——扩充PL/0编译程序使其能完成对如下三个扩充功能的编译
PL/0语言的三个扩充功能:
1. 一维数组的扩充,语法如下: VAR <数组标识符> ‘[’数组长度‘]’ 2. 条件语句的扩充,语法如下:
<条件语句> ::=IF<条件>THEN <语句> [ELSE <语句>] 3. 重复语句的扩充,语法如下: <重复语句> ::=REPEAT <语句>{; <语句>}UNTIL <条件>
实验目的:
1. 为了更好的配合《编译原理》有关词法分析章节的教学 2. 加深和巩固学生对于语法分析的了解和掌握
3. 让学生进一步的认识PL/0语言的基础和简单的程序编写 4. 使学生通过本实验能够扩大对pl/0的理解。 5. 提高学生的上机和编程过程中处理具体问题的能力
实验要求
1. 在做本实验之前要先阅读完总体的预备知识以及本实验相关的基础知识。 2. 本实验要求自己独立的完成,不允许抄袭别人的实验结果。 3. 在编写和调试过程中出现的问题最好做一下记录。 4. 阅读懂扩充语法图所给出的语法。
实验内容:
1. 给出三个扩充功能的语法描述图及EBNF的语法描述;
2. 在已理解所给出的pl/0编译程序的基础上,要求对其进行扩展,使扩展后的PL/0编译程序能够完成对三个扩充功能的编译; 3. 结合所给出的两个PL/0源程序(test1.pl0, test2.pl0),对所改进的PL/0编译程序
进行调试;