华北科技学院_编译原理pl0实验报告

华北科技学院计算机系综合性实验 实 验 报 告

课程名称 编译原理 实验学期 2011 至 2012 学年 第 2 学期 学生所在系部 计算机系 年级 11级 专业班级 计算机ZB111 学生姓名 学号 任课教师 王养廷 实验成绩

计算机系制 华北科技学院计算机系综合性实验报告

第 1 页 《 编译原理 》课程综合性实验报告

开课实验室:基础七 2012 年 5 月 15 日 实验题目 pl0 语言编译器分析

一、实验目的 1、掌握对pl0语言源程序进行词法分析的方法。 2、掌握对pl0语言源程序进行语法分析的方法。 3、掌握对表达式进行计算分析的原理和方法。 4、了解虚拟机的概念及解释器的设计原理。 5、加强对程序进行Debug跟踪调试的能力。

二、设备与环境 PC兼容机 DOS操作系统或Windows操作系统 TurboPascal软件等

三、实验内容及要求 1.实验要求 1、pl0 语言编译器设计原理及功能模块图。 2、pl0 语言编译器的各功能模块的详细设计。 3、各模块中应用到的关键技术的详细说明。 2.实验内容 1、 pl0的知识结构: 华北科技学院计算机系综合性实验报告

第 2 页 2、 pl0主要文法结构:

〈程序〉∷=〈分程序〉. 〈分程序〉∷=[〈常量说明部分〉][〈变量说明部分〉][〈过程说明部分〉]〈语句〉 〈常量说明部分〉∷=CONST〈常量定义〉 {,〈常量定义〉}; 〈常量定义〉∷=〈标识符〉=〈无符号整数〉 〈无符号整数〉∷=〈数字〉{〈数字〉} 〈变量说明部分〉∷=VAR〈标识符〉{,〈标识符〉}; 〈标识符〉∷=〈字母〉{〈字母〉|〈数字〉} 〈过程说明部分〉∷=〈过程首部〉〈分程序〉{;〈过程说明部分〉}; 〈过程首部〉∷=PROCEDURE〈标识符〉; 〈语句〉∷=〈赋值语句〉|〈条件语句〉|〈当型循环语句〉| 〈过程调用语句〉|〈读语句〉|〈写语句〉|〈复合语句〉|〈空〉

3、 类pcode代码指令的结构: (1) pl0主要指令集: ① LIT:将常量值取到运行栈顶。a域为常数值。 ② LOD:将变量放到栈顶。a域为变量在所说明层中的相对位置,l为调用层与说明层的层差值。 ③ STO:将栈顶的内容送入某变量单元中。a,l域的含意同LOD指令。 ④ CAL:调用过程的指令。a为被调用过程的目标程序入口地址,l为层差。 ⑤ INT:为被调用的过程(或主程序)在运行栈中开辟数据区。a域为开辟的单元个数。 ⑥ JMP:无条件转移指令,a为转向地址。 ⑦ JPC:条件转移指令,当栈顶的布尔值为非真时,转向a域的地址,否则顺序执行。 ⑧ OPR:关系运算和算术运算指令。将栈顶和次栈顶的内容进行运算,结果存放在次栈顶,此外还可以是读写等特殊功能的指令,具体操作由a域值给出。 (2) pl0指令功能 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 过程调用结束后,返回调用点并退栈 华北科技学院计算机系综合性实验报告 第 3 页 OPR 0 1 栈顶元素取反 OPR 0 2 次栈顶与栈顶相加,退两个栈元素,结果值进栈 OPR 0 3 次栈顶减去栈顶,退两个栈元素,结果值进栈 OPR 0 4 次栈顶乘以栈顶,退两个栈元素,结果值进栈 OPR 0 5 次栈顶除以栈顶,退两个栈元素,结果值进栈 OPR 0 6 栈顶元素的奇偶判断,结果值在栈顶 OPR 0 7 OPR 0 8 次栈顶与栈顶是否相等,退两个栈元素,结果值进栈 OPR 0 9 次栈顶与栈顶是否不等,退两个栈元素,结果值进栈 OPR 0 10 次栈顶是否小于栈顶,退两个栈元素,结果值进栈 OPR 0 11 次栈顶是否大于等于栈顶,退两个栈元素,结果值进栈 OPR 0 12 次栈顶是否大于栈顶,退两个栈元素,结果值进栈 OPR 0 13 次栈顶是否小于等于栈顶,退两个栈元素,结果值进栈 OPR 0 14 栈顶值输出至屏幕 OPR 0 15 屏幕输出换行 OPR 0 16 从命令行读入一个输入置于栈顶

4、 PL/0编译程序的结构:

图1 图2 华北科技学院计算机系综合性实验报告

第 4 页 图3 华北科技学院计算机系综合性实验报告

第 5 页 图4

5、 PL/0编译程序的词法分析:

图5 华北科技学院计算机系综合性实验报告

第 6 页 图6 6、 PL/0编译程序的语法分析:

图7 华北科技学院计算机系综合性实验报告

第 7 页 图8 表 2.2 TABLE表中的信息

NAME KIND LEVEL/VAL ADR SIZE TXo→ A B C D E P CONSTANT CONSTANT VARIABLE VARIABLE VARIABL EPROCEDUR 35

49 LEV LEV LEV LEV DX DX+1 DX+2 过程p的入口(待填) 4 TX→ G … VARIABLE … LEV+1 … ADR:DX …

TABLE表的表头索引TX和层次单元LEV都以BLOCK的参数形式出现。在主程序调用BLOCK时实参值都为0。每个过程中变量的相对起始位置在BLOCK内置初值DX∶=3。 华北科技学院计算机系综合性实验报告 第 8 页 7、 PL/0编译程序的目标代码结构和代码生成: ①对分程序体人口的处理(见程序文本block 的过程体) begin (*block*) dx:=3; tx0:=tx; (*保留当前table表指针值,实际为过程名在table表中的位置*) table[tx].adr:=cx;(*保留当前code指针值到过程名的adr域*) gen(jmp,0,0); 记录过程在code的入口到table中的adr域如下表所示:

图9 (*生成转向过程体入口的指令,该指令的地址为cx已保留在过程名的adr域,真正的过程体入口地址,等生成过程体入口的指令时,再由table[tx].adr中取出 cx将过程体入口返填到cx所指目标代码,即:(jmp,0,0)的第3区域,同时填到table[tx].adr 中*) ②过程体入口时的处理 code[table[tx0].adr].a:=cx;(cx为过程入口地址,填写在code中) with table[tx0] do begin adr:=cx; (过程的入口填写在table表的过程名中) size:=dx; (过程需要的空间填写在table中) end; cxo:=cx; (保留过程在code中的入口地址在输出目标代码时用) gen(int,0,dx);(生成过程入口指令)

table表格管理 华北科技学院计算机系综合性实验报告 第 9 页 图10 8、 PL/0编译程序的目标代码解释执行时的存储分配: 当源程序经过语法分析,如果未发现错误时,由编译程序调用解释程序,对存放在CODE中的目标代码CODE[0]开始进行解释执行。当编译结束后,记录源程序中标识符的TABLE表已没有作用。因为计算每个变量在运行栈中相对本过程基地址的偏移量dx 的值,放在table表中的adr域,生成目标代码时再从adr域中取出基地址的偏移量 ,放在code中的a域。 因此数据空间只需以数组CODE存放的只读目标程序和运行时的数据栈S。S是由解释程序定义的一维整型数组。由于PL/0语言的目标程序是一种假想的栈式计算机的汇编语言,仍用PASCAL语言解释执行。解释执行时的数据空间S为栈式计算机的存储空间。遵循后进先出规则,对每个过程(包括主程序)当被调用时,才分配数据空间,退出过程时,则所分配的数据空间被释放。

变量在code [cx] 、table[tx]和s[t]之间的信息联系

图11 解释定义了4个寄存器

(1) I:指令寄存器。存放着当前正在解释的一条目标指令。 华北科技学院计算机系综合性实验报告 第 10 页 (2) P:程序地址寄存器。指向下一条要执行的目标程序的地址(相当目标程序CODE数组的下标)。 (3) T:栈顶寄存器。由于每个过程当它被运行时,给它分配的数据空间(下边称数据段)可分成两部分。 静态部分:包括变量存放区和三个联系单元(联系单元的作用见后)。 动态部分:作为临时工作单元和累加器用。需要时随时分配,用完后立即释放。栈顶寄存器T指出了当前栈中最新分配的单元(T也是数组S的下标)。 (4) B:基址寄存器。指向每个过程被调用时,在数据区S中给它分配的数据段起始地址,也称基地址。 为了实现对每个过程调用时给它分配数据段,也就是对即将运行的过程所需数据段进栈;过程运行结束后释放数据段,即该数据段退栈;以及嵌套过程之间对标识符引用的寻址问题。每个过程被调用时,在栈顶分配三个联系单元,这三个单元存放的内容分别为: (1) SL:静态链:它是指向定义该过程的直接外过程(或主程序)运行时最新数据段的基地址。 (2) DL:动态链:它是指向调用该过程时正在运行过程的数据段基地址。 (3) RA:返回地址:记录调用该过程时目标程序的断点,即当时的程序地址寄存器P的值。也就是调用过程指令的下一条指令的地址。

图12 例:若有程序结构为: … procedure A: … procedure B: … procedure C: 程序体C … call B: … 程序体B … call C: … 程序体A … call B:

合集下载

编译原理课程设计报告---PL0编译程序改进及完善

编译原理课程设计报告---PL0编译程序改进及完善

燕山大学《编译原理课程设计》题目:《PL/0编译程序改进及完善》姓名:简越班级:06级计算机应用3班学号:060104010084日期:2009年7月15日设计题目:PL/0编译程序改进及完善。

设计目的:阅读研究,改进设计和调试一个简单的编译程序。

加深对编译理论和过程的了解。

设计要求:1.有选择的对PL/0编译源程序补充,完善.2.设计编译典型的运行实例,以便反应出自己作出改进后的编具有的功能。

设计思想:PL/0语言可以看成PASCAL语言的子集,它的编译程序是一个编译解释执行系统。

PL/0的目标程序为假想栈式计算机的汇编语言,与具体计算机无关。

PL/0的编译程序和目标程序的解释执行程序都是用PASCAL语言书写的,因此PL/0语言可在配备PASCAL语言的任何机器上实现。

其编译过程采用一趟扫描方式,以语法分析程序为核心,词法分析和代码生成程序都作为一个独立的过程,当语法分析需要读单词时就调用词法分析程序,而当语法分析正确需要生成相应的目标代码时,则调用代码生成程序。

用表格管理程序建立变量、常量和过程表示符的说明与引用之间的信息联系。

当源程序编译正确时,PL/0编译程序自动调用解释执行程序,对目标代码进行解释执行,并按用户程序的要求输入数据和输出运行结果。

主要变量说明:/*变量说明*/FILE* fas; /*输出名字表*/FILE* fa; /*输出虚拟机代码*/FILE* fa1; /*输出源文件及其各行对应的首地址*/FILE* fa2; /*输出结果*/bool listswitch; /*显示虚拟机代码与否*/bool tableswitch; /*显示名字表与否*/char ch; /*获取字符的缓冲区,getch使用*/enum symbol sym; /*当前的符号*/char id[al+1]; /*当前ident,多出的一个字节用于存放0*/ int num; /*当前number*/int cc,ll; /*getch使用的计数器,cc表示当前字符(ch)的位置*/int cx; /*虚拟机代码指针,取值范围[0,cxmax-1]*/char line[81]; /*读取行缓冲区*/char a[al+1]; /*临时符号,多出的一个字节用于存放0*/ struct instruction code[cxmax]; /*存放虚拟机代码的数组*/char word[norw][al]; /*保留字*/enum symbol wsym[norw]; /*保留字对应的符号值*/enum symbol ssym[256]; /*单字符的符号值*/char mnemonic[fctnum][5]; /*虚拟机代码指令名称*/bool declbegsys[symnum]; /*表示声明开始的符号集合*/bool statbegsys[symnum]; /*表示语句开始的符号集合*/bool facbegsys[symnum]; /*表示因子开始的符号集合*//* 目标指令*/1、LIT:将常量值取到运行栈顶.2、LOD:将变量放到运行栈顶.3、STO:将栈顶的内容送入某变量单元中.4、CAL:调用过程的指令.5、INT:为被调用的过程(或主程序)在运行栈中开辟数据区.6、JMP:无条件转移指令.7、JPC:条件转移指令,当栈顶的布尔值为真时, 顺序执行,否则转向域的地址.8、OPR:系运算符和算术运算指令.将栈顶和次栈顶的内容进行运算,结果存放栈顶./*函数说明*/void error(int n,int line)说明:出错处理函数,打印出错信息,错误总数加1。

华科编译原理实验报告

华科编译原理实验报告

课程实验报告课程名称:《编译原理》专业班级:学号:姓名:指导教师:报告日期:计算机科学与技术学院实验一词法分析程序实现一、实验目的与要求通过编写和调试一个词法分析程序,掌握在对程序设计语言的源程序进行扫描的过程中,将字符形式的源程序流转化为一个由各类单词符号组成的流的词法分析方法。

二、实验内容根据教学要求并结合学生自己的兴趣和具体情况,从具有代表性的高级程序设计语言的各类典型单词中,选取一个适当大小的子集。

例如,可以完成无符号常数这一类典型单词的识别后,再完成一个尽可能兼顾到各种常数、关键字、标识符和各种运算符的扫描器的设计和实现。

输入:由符合或不符合所规定的单词类别结构的各类单词组成的源程序。

输出:把单词的字符形式的表示翻译成编译器的内部表示,即确定单词串的输出形式。

例如,所输出的每一单词均按形如(CLASS,VALUE)的二元式编码。

对于变量和常数,CLASS字段为相应的类别码;VALUE字段则是该标识符、常数的具体值或在其符号表中登记项的序号(要求在变量名表登记项中存放该标识符的字符串;常数表登记项中则存放该常数的二进制形式)。

对于关键字和运算符,采用一词一类的编码形式;由于采用一词一类的编码方式,所以仅需在二元式的CLASS字段上放置相应的单词的类别码,VALUE字段则为“空”。

另外,为便于查看由词法分析程序所输出的单词串,要求在CLASS字段上放置单词类别的助记符。

三、实现方法与环境词法分析是编译程序的第一个处理阶段,可以通过两种途径来构造词法分析程序。

其一是根据对语言中各类单词的某种描述或定义(如BNF),用手工的方式(例如可用C语言)构造词法分析程序。

一般地,可以根据文法或状态转换图构造相应的状态矩阵,该状态矩阵同控制程序便组成了编译器的词法分析程序;也可以根据文法或状态转换图直接编写词法分析程序。

构造词法分析程序的另外一种途径是所谓的词法分析程序的自动生成,即首先用正规式对语言中的各类单词符号进行词型描述,并分别指出在识别单词时,词法分析程序所应进行的语义处理工作,然后由一个所谓词法分析程序的构造程序对上述信息进行加工。

编译实习报告

编译实习报告

编译实习报告篇一:篇一:编译原理实习报告实习报告【实习目的】1.了解编译器的工作原理2.掌握并加深本学期所学的编译原理的理论知识3.加强自己的动手能力【实习内容】1.编译并运行老师所给的编译器参考代码2.在第一步的基础上进一步改进编译器,增加输入输出功能【开发平台】window系统,free pascal编译器【实习过程】本次实习过程根据实习内容共分两大部分,第一部分,编译运行参考代码;第二部分,进一步改进编译器。

本人在上面的基础上又增加了第三部分的额外修改。

下面便总结这三部分的实习过程:一、增加读写语句前pl0编译程序由于最原始的pl0编译程序所用的pascal版本较老,有些和当前使用版本不兼容。

必须作相应修改,具体是:“object”和“procedure”为pascal的保留字,现分别改成“obj”和“proc”。

此外,原始程序中的“≠”、“≤”和“≥”,不能用ascii 码表示出来,现将其替换成“”、“=”。

作为一个编译程序,支持批量处理和永久保存是其应具备的基本功能。

为此,本程序加入了文件读写功能,即从文件读入pl0源程序,在将中间代码和运行结果写入文件。

由于源程序和原始差别很小,为节省篇幅,不将其打印出来。

二、增加读写语句前pl0调试程序下面是增加读写语句前的pl0程序,包含了乘、除法和寻找两个自然数的最大公因数的过程和主过程,很好的说明了增加读写语句前的pl0语言的使用方法。

constvarx,y,z,q,r; procedure multiply; var a,b; a:=x; begin m=7,n=85;procedure divide; var end; b:=y; z:=0; while b>0 do begin end if odd b then z:=z+a; a:=2*a; b:=b/2;w;beginr:=x;q:=0;w:=y;while wy dobegin q:=2*q; w:=w/2;if wg dobeginif f0 do 13begin13 if odd b then z:=z+a; 20 a:=2*a;24 b:=b/2; 28end28 end;2 int 0 53 lod 1 34 sto 0 35 lod 1 46 sto 0 47 lit 0 08 sto 1 59 lod 0 410 lit 0 011 opr 01212 jpc 02913 lod 0 414 opr 0 615 jpc 02016 lod 1 517 lod 0 318 opr 0 219 sto 1 520 lit 0 221 lod 0 322 opr 0 423 sto 0 324 lod 0 425 lit 0 226 opr 0 527 sto 0 428 jmp 0 929 opr 0 03030 procedure divide;30 var31w;31 begin32r:=x;34q:=0;36w:=y;38while wy do51begin q:=2*q; w:=w/2;59 if w篇二:编译原理实习报告实习报告【实习目的】1.了解编译器的工作原理2.掌握并加深本学期所学的编译原理的理论知识3.加强自己的动手能力【实习内容】1.编译并运行老师所给的编译器参考代码2.在第一步的基础上进一步改进编译器,增加输入输出功能【开发平台】Window系统,Free Pascal编译器【实习过程】本次实习过程根据实习内容共分两大部分,第一部分,编译运行参考代码;第二部分。

编译原理课程设计与报告

编译原理课程设计与报告

课程设计课程名称__ 编译原理_ 题目名称PL/0语言的扩充学生学院___ 计算机学院______ 专业班级_ 软件工程07级4班__ 学号学生姓名指导教师____ 李小妹________ 2008 年 1 月 5 日课程设计实验报告一、概述:源语言: PL/0目标语言: 目标代码(生成的文件后缀为*.COD)实验工具: Borland C++Builder 6运行平台: WindowsXP目的:在分析理解一个教学型编译程序(如PL/0)的基础上,对其词法分析程序、语法分析程序和语义处理程序进行部分修改扩充。

达到进一步了解程序编译过程的基本原理和基本实现方法的目的。

要求:对PL/0作以下修改扩充:基本内容(1)扩充赋值运算:+= 和-=(2)扩充语句(Pascal的FOR语句):①FOR <变量>:=<表达式> TO <表达式> DO <语句>②FOR <变量>:=<表达式> DOWNTO <表达式> DO <语句>其中,语句①的循环变量的步长为1,语句②的循环变量的步长为-1。

选做内容(1)增加运算:++ 和--。

(2)增加类型:①字符类型;②实数类型。

(3)扩充函数:①有返回值和返回语句;②有参数函数。

(4)增加一维数组类型(可增加指令)。

(5)其他典型语言设施。

二、结构设计说明:各功能模块描述Error()出错处理,打印出错位置和错误编码GetCh()漏掉空格,读取一个字符GetSym()词法分析,读取一个单词GEN()目标代码生成过程,本过程用于把生成的目标代码写入目标代码数组,供后面的解释器解释执行TEST()测试当前单词是否合法过程testENTER()登陆符号表过程enterPOSITION()在符号表中查找指定符号所在位置的函数position V ARDECLARATION()变量声明处理LISTCODE()输出目标代码清单;FACTOR()因子处理过程factorTERM()项处理过程term;EXPRESSION()表达式处理过程CONDITION()条件处理过程STA TEMENT()语句处理过程BLOCK()编译程序主体,语法分析过程BASE()通过静态链求出数据区基地址的函数,INTERPRET ()对目标代码解释运行过程Pl0编译程序的结构目标程序编译程序的总体流程图词法分析状态转换图.○表示状态,对应每个状态编一段程序,每个状态调用取字符程序,根据当前字符转到不同的状态,并做相应操作。

PL0实现报告(1)

PL0实现报告(1)

PL/0语言的语法描述程序语法描述图分程序语法描述图语句语法描述条件语句描述图表达式语法描述项语法描述因子语法描述1、PL/0语言文法的EBNF(巴克斯-瑙尔范式)表示〈表达式〉::=[+|-]〈项〉{〈加法运算符〉〈项〉}〈项〉::=〈因子〉{〈乘法运算符〉〈因子〉}〈因子〉::=〈标识符〉|〈无符号整数〉|‘(’〈表达式〉‘)’〈加法运算符〉::=+|-〈乘法运算符〉::=*|/〈关系运算符〉::==|#|<|<=|>|>=〈条件语句〉::=IF〈条件〉THEN〈语句〉〈过程调用语句〉::=CALL〈标识符〉〈当型循环语句〉::=WHILE〈条件〉DO〈语句〉〈读语句〉::=READ‘(’〈标识符〉{,〈标识符〉}‘)’〈写语句〉::=WRITE‘(’〈表达式〉{,〈表达式〉}‘)’〈字母〉::=a|b|…|X|Y|Z〈数字〉::=0|1|…|8|92、PL/0编译程序的结构PL/0语言可以看成PASCAL语言的子集,它的编译程序是一个编译解释执行系统。

PL/0的目标程序为假想栈式计算机的汇编语言,与具体计算机无关。

PL/0的编译程序和目标程序的解释执行程序都是用PASCAL语言书写的,因此PL/0语言可在配备PASCAL语言的任何机器上实现。

其编译过程采用一趟扫描方式,以语法分析程序为核心,词法分析和代码生成程序都作为一个独立的过程,当语法分析需要读单词时就调用词法分析程序,而当语法分析正确需要生成相应的目标代码时,则调用代码生成程序。

用表格管理程序建立变量、常量和过程表示符的说明与引用之间的信息联系。

用出错处理程序对词法和语法分析遇到的错误给出在源程序中出错的位置和错位性质。

当源程序编译正确时,PL/0编译程序自动调用解释执行程序,对目标代码进行解释执行,并按用户程序的要求输入数据和输出运行结果。

PL/0语言使用PASCAL语言书写的,整个编译程序(包含主程序)是由18个嵌套机并列的过程或函数组成。

《编译原理》设计方案报告

《编译原理》设计方案报告

《编译原理》课程设计报告设计题目:pl0编译器设计一、PL0程序的文法及,指令及属性翻译简化c语言文法定义(LL(1)文法)C程序::=void main(){函数体}函数体::=变量定义部分语句列变量定义部分::=变量定义变量定义部分| ɛ变量定义::=int 变量表变量表::=标识符|标识符,变量表语句列::=语句语句列| ɛ语句::=条件语句| 循环语句| 读语句| 写语句| 复合语句| 表达式语句| 空语句条件语句::=if(表达式)语句循环语句::=while(表达式)语句读语句::=read(变量表);写语句::=write(表达式表);复合语句::={语句列};表达式语句::=表达式;空语句::=;表达式定义(算符优先文法)表达式::=变量=表达式| 变量+=表达式| 变量-=表达式| 变量*=表达式| 变量/=表达式| 变量%=表达式| 表达式1表达式1::=表达式1 || 表达式2 | 表达式2表达式2::=表达式2&&表达式3 | 表达式3表达式3::=表达式3==表达式4 | 表达式3!=表达式4 | 表达式3>=表达式4 | 表达式3>表达式4 | 表达式3<=表达式4 | 表达式3<表达式4 | 表达式4表达式4::=表达式4+表达式5 | 表达式4-表达式5 | 表达式5表达式5::=表达式5*表达式6 | 表达式5/表达式6 |表达式5/表达式6 |表达式6表达式6::=!表达式7表达式7::=(表达式) | 变量| 常量PL0文法定义《程序》::=《分程序》.《分程序》::=《常量定义》;《常后分程序》|《常后分程序》《常后分程序》::=《变量定义》;《变后分程序》|《变后分程序》《变后分程序》::=《过程定义》;《变后分程序》|《语句》《常量定义》::=const 《常量定义表》《常量定义表》::=id = number | id = number,《常量定义表》《变量定义》::= var 《变量表》《变量表》::=id | id,《变量表》《过程定义》::=procedure id ;《分程序》《语句》::=《赋值语句》|《条件语句》|《循环语句》|《读语句》|《写语名》|《复合语句》| 《过程调用语句》|ε《赋值语句》::=id := 《表达式》《读语句》::=read(《变量表》)《写语句》::=write(《表达式表》)《表达式表》::=《表达式》| 《表达式》,《表达式表》《条件语句》::=if 《条件表达式》then 《语句》《循环语句》::=while 《条件表达式》do 《语句》《复合语句》::=begin 《语句列》end《过程调用语句》::=call id《参量表》::=《有参表》|ε《有参表》::=《表达式》,《有参表》|《表达式》《表达式》::=+《表达式1》|-《表达式1》|《表达式1》《表达式1》::=《表达式1》+《表达式2》|《表达式1》-《表达式2》|《表达式2》《表达式2》::=《表达式2》*《表达式3》|《表达式2》/《表达式3》| 《表达式2》mod 《表达式3》|《表达式3》《表达式3》::=id | number | (《表达式》)《条件表达式》::=《条件表达式》or 《条件表达式1》|《条件表达式1》《条件表达式1》::=《条件表达式1》and 《条件表达式2》| 《条件表达式2》《条件表达式2》::=not 《条件表达式3》|《条件表达式3》《条件表达式3》::=(《条件表达式》)|《关系表达式》《关系表达式》::=《表达式》>《表达式》《关系表达式》::=《表达式》>=《表达式》《关系表达式》::=《表达式》<《表达式》《关系表达式》::=《表达式》<=《表达式》《关系表达式》::=《表达式》=《表达式》《关系表达式》::=《表达式》#《表达式》PL0栈式机指令指令格式:指令码(f) 所在层数差(l),操作数(a)PL0栈式机指令:LIT:将常数a取到栈顶LOD:将位于(当前层-l)层处的变量a取到栈顶STO:将栈顶处值存储到指定位置,l,a同上CALL 调用当前-l层处的过程aINT:为调用过程在栈中开辟数据区,a为单元个数JMP:无条件转移指令,a目标地址JPC:条件转移指令,栈顶值的布尔值为非真时转移到a处,否则执行下面语句OPR:关系运算或算术运算PL0属性翻译MCONST(const:常量定义开始), V AR(var:变量定义开始), PROCEDURE(procedure:过程定义开始),CALL(call:过程调用语句),BEGIN(begon:复合语句开始),END(end:复合语句结束),IF(if:条件语句开始),THEN(then:条件结束),WHILE(while:循环语句开始), DO(do:循环条件结束), READ(read:读语句),WRITE(write:输出语句), ODD(odd:判奇运算),//分隔符、运算符号DOT(点:.),COMMA(逗号:,), SEMICOLON(分号:;), LPAREN(左括号:(), RPAREN(右括号:)), ASSIGNOP(赋值::=), PLUSOP(加法运算符号:+), MINUSOP(减法运算符:-), MULTOP(乘法运算符:*), DIVOP(除法运算符:/),GT(大于:>),GE(大于等于:>=),LT(小于:<),LE(小于等于:<=),EQ(等于:=),NE(不等:#),ENDF(输入结束符),//分析过程中需要的非终结符号SERVERKEY(保留字), FACTOR(因子),ROP(关系运算), CONSTANT(常量部份定义), V ARIABLE(变量部份定义), IDENT(自定义标识符), NUMBER(常数)二、符号表的结构,组织,填写及查找1、符号表结构const char *pName; //符号名称int kind; //符号类别,由上面单词分类确定int val; //符号表中的位置值int level; //符号的层数int parent; //符号的作用域int size; //过程长度char strBuff[MAXLENSTR]; //符号堆2、符号表的组织符号表的组织方式有:线性表、散列表、树结构等,其必须维持源程序中的作用域信息。

编译原理试验报告

编译原理实验报告题目PL/0编译器功能扩展学院计算机学院专业软件工程年级2003级2班学号3103003343 姓名李建康指导教师陈靖宇老师(2006 年6月)目录一、概要分析 (2)1. 我对PL/0编译程序认识: (2)2. Pl/0语言上机要求 (3)2.1必做内容:2.2选做内容:3.开发计划 (4)二、详细设计 (4)1.修改部分的PL/0语法描述图 (4)2.新增功能的结构设计说明 (5)2.1增加以下的数据结构2.2初始化保留字表和类型表3.新增功能的功能模块描述 (7)3.1.词法分析:不等号# 改为 <>;+=、-=、++、--的类型识别3.2.增加条件语句的ELSE子句3.3.扩充赋值运算:+= 和 -=,后置++、--3.4.扩充语句(Pascal的FOR语句)3.5.增加语句运算:前置++ 和 --;因子的后置++、--;项的前置++、--3.6.增加一维数组运算三、主要成分描述 (15)1.符号表 (15)2. 运行时存储组织和管理 (15)3. 语法分析方法 (16)4. 中间代码表示 (16)四、测试用例 (17)五、开发过程和完成情况总结 (18)功能扩展实验报告一、概要分析1.我对PL/0编译程序认识:PL/0语言是Pascal语言的一个子集,是一种简单而且可扩充的语言,在我的测试用例中有具体的体现。

它通过词法分析、语法分析、语义分析等过程,生成目标代码,目标代码是一种形似汇编语言的栈操作指令。

本实验使用的开发工具是C++ Builder6.0,实现和测试平台都是windows XP sp1。

通过学习编译原理,我初步理解了PL/0语言及其编译程序的原理。

我先说一下整体的认识,当我们按下“演示”这个按钮时,程序首先要做的是为保留字表及其类型,还有使用的各种符号集赋初值,开辟空间等,这个模块置为Init();输入PL/0源文件,执行编译模块block();如果没有出错,执行解释模块Interpret();输出为目标代码和日志。

编译原理实践4——程序设计语言PL0


2.EBNF定义的PL/0语法
program = block ".".
A program is a block.
block = [ "const" ident "=" number { "," ident "=" number } ";" ] [ "var" ident { "," ident } ";" ] { "procedure" ident ";" block ";" } statement.
3. PL/0语法图
block—分程序 statement—语句 condition---条件 expression---表达式 term---项 factor---因子
4.判别是否符合两条限制规则
方法: 1)找出图中每一个分支点,考察每一个分 支点的各个分支的头符号是否相异 2)找出图中每一个透明结构,考察每个透 明结构,考察每个透明结构的头符号集 合与其跟随符号集合是否相异 结论:PL/0语言文法符合两条限制规则, 可以应用简单辨认算法的LL(1)文法。
保留字: begin, call, const, do, end, if, odd, procedure, then, var, while 符号: . , ; := + - * / ( ) 标识符:以字母开头的,任意字母和数字组成 的序列 数:阿拉伯数字的序列 关系运算符: < > <= >= # =
var a, b; begin a:=10; if a < 12 then b := a/2; end.

编译原理课程实验指导书-PL0语言及其编译器.

《编译原理》课程实验指导书(Compiler Principle)目录序言 (1)一、实验安排 (2)第一阶段:编译器的词法分析 (2)第二阶段:编译器的语法分析 (2)第三阶段:编译器的代码生成 (3)二、考核方式及评定标准 (4)三、参考资料与编译器分析 (4)第一部分PL语言及其编译器 (4)1. PL语言介绍 (4)1.1 PL语言的语法图 (5)2. PL语言编译器 (8)2.1 词法分析 (9)2.2 语法分析 (9)2.3 语义分析 (11)2.4代码生成 (11)2.5 代码执行 (13)2.6 错误诊断处理 (15)2.7 符号表管理 (17)2.8其他 (18)第二部分上机实验要求 (19)第三部分PL语言编译器源程序与示例 (21)1.示例与结果表示 (21)1.1 PL语言源程序 (21)1.2 生成的代码(片段) (28)2.PL语言编译器源程序 (28)序言本《编译原理》实验,其目的是让大家动手设计和实现一个规模适中的语言的编译器,该编译器不仅涉及编译程序的各个阶段,而且也强调了编译的总体设计、各个阶段的接口安排等等。

通过上机实践,来设计这个相对完整的编译器,一方面可以使同学们增加对编译程序的整体认识和了解——巩固《编译原理》课程所学知识,另一方面,通过上机练习,学生也可以学到很多程序调试技巧和设计大型程序一般的原则,如模块接口的协调,数据结构的合理选择等等。

为了使学生能尽早动手实践,我们建议把实践分成三部分,首先阅读本教程第一部分,在这部分就PL语言的语法及其编译程序的各个阶段作了简单介绍,以便对PL编译程序有个初步的印象。

其次要认真阅读理解第三部分所给出的PL编译器源程序及示例,使上一阶段的初步印象得以加深、具体化。

最后按照第二部分的实验要求扩充PL语言的功能并加以实现。

具体操作时分成三个阶段:词法分析、语法分析及代码生成。

最后再统一组装成一个完整的PL编译器,并适当进行改进、补充。

《编译原理》课程实验报告(词法分析)

信息科学与工程学院__《编译原理》_实验报告系别计算机科学与工程专业计算机科学与应用班级_____计122_______学号_____10123544_____姓名_____ 陈柏君_________指导教师金登男2014学年第二学期1.实验题目:词法分析2.实验日期:2015.4.9-2015.4.163.实验环境(操作系统,开发语言)操作系统:Windows开发语言:C4.实验要求4.1.用C语言开发词法分析程序PL0Compiler。

4.2.修改PL/0词法,将其定义为一种新的语言,例如称其为PL/1语言,并完成PL/1语言的词法分析程序。

5.实验步骤5.1.用PL/0语言编写PL/0测试用例源程序,将其命名为Test0.pl。

5.2.用C语言开发PL/0词法分析程序PL0Compiler。

PL0Compiler读入Test0.pl,识别出一个个单词,并将这些单词流依序同时输出到屏幕和文件中。

被输出的每个单词应包括(1)单词序号(2)单词字符串(3)单词类型(4)单词值(如果是标识符,其值是字符串;如果是数,其值是数值;如果是符号,其值是ASCII代码…)在程序开发过程中,应设立断点,单步运行词法分析程序,依次输出一个个单词。

分析和理解词法分析程序,解释词法分析程序中的数据和变量变化的原因和输出结果。

5.3.研究其他程序设计语言,找出与PL/0词法不同的构词法则(例如C语言的标识符的组成规则与PL/0标识符的组成规则有所不同)。

据此修改PL/0的某些词法(例如,将PL/0标识符组成规则修改为C语言的标识符的组成规则),将其定义为一种新的语言,例如称其为PL/1语言。

5.4.用PL/1语言编写PL/1测试用例源程序,将其命名为Test1.pl。

5.5.开发PL/1词法分析程序PL1Compiler。

(可通过修改原PL0Compiler,实现PL/1语言的词法分析功能)。

5.6.PL1Compiler读入Test1.pl,识别出一个个单词,并将这些单词流依序同时输出到屏幕和文件中。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档