编译原理课程设计-PLO.docx

上传人:自*** 文档编号:124906849 上传时间:2020-03-14 格式:DOCX 页数:23 大小:170.85KB
返回 下载 相关 举报
编译原理课程设计-PLO.docx_第1页
第1页 / 共23页
编译原理课程设计-PLO.docx_第2页
第2页 / 共23页
编译原理课程设计-PLO.docx_第3页
第3页 / 共23页
编译原理课程设计-PLO.docx_第4页
第4页 / 共23页
编译原理课程设计-PLO.docx_第5页
第5页 / 共23页
点击查看更多>>
资源描述

《编译原理课程设计-PLO.docx》由会员分享,可在线阅读,更多相关《编译原理课程设计-PLO.docx(23页珍藏版)》请在金锄头文库上搜索。

1、课 程 设 计 课程名称_编译原理 _ _题目名称_编译原理课程设计 _ 学生学院_计算机学院 _ 专业班级_计算机科学与技术_ 学 号_ _学生姓名_ _ _指导教师_ _ _201 年 1 月 7 日一、 实验目的与要求课内实验(考试前交报告)对PL/0作以下修改扩充:(1)增加单词:保留字 ELSE,FOR,STEP,UNTIL,RETURN运算符 +=,-=,+,-,(2)修改单词:不等号# 改为 (3)增加条件语句的ELSE子句,要求:写出相关文法,语法图,语义规则。课程设计基本内容(成绩范围:“中”、“及格”或“不及格”)(1)扩充赋值运算:+= 和 -=(2)扩充语句(Pasca

2、l的FOR语句):FOR := STEP UNTIL DO (3)增加运算:+ 和 -。选做内容(成绩评定范围扩大到:“优”和“良”)(1)增加类型: 字符类型; 实数类型。(2)扩充函数: 有返回值和返回语句; 有参数函数。(3)增加一维数组类型(可增加指令)。(4)其他典型语言设施。二、 实验环境与工具(1)计算机及操作系统:PC机,Windows 7(2)程序设计语言: C语言(3)教学型编译程序:PL/0 三、 设计方案(1) 概述课程设计的目标是做一个编译器,用的是PL/0语言,该语言功能简单、结构清晰、可读性强、又具备了一般高级语言的必须部分. PL/0语言的语句类型丰富,能适应各

3、种可能性的程序结构.最基本的语句是赋值语句.组合结构语句有语句串、条件语句和循环语句.数据类型只有整数类型一种.PL/0允许在一个过程范围内说明常数、变量和过程.也允许递归调用,既可以间接递归,也可以直接递归.因而PL/0语言编译器是一个非常合适的小型编译程序的教学模型 PL/0的目标程序为假想栈式的计算机的汇编语言,与具体计算机无关,可称为类PCODE指令代码,其指令集极为简单,指令格式也很单纯.本PL/0编译器是在C+Builder集成环境下,用C语言实现,在Window 7平台下运行通过的.(2) 编译和解释执行的结构图:语法语义分析程序表格管理程序出错处理程序PL/0源程序目标程序代码

4、生成程序程序词法分析程序程序PL/0语言编译过程采用一趟扫描方式,以语法分析程序为核心,词法分析程序和代码生成程序都作为一个独立的过程,当语法分析需要读单词时就调用词法分析程序,而当语法分析正确需生成相应的目标代码时,则调用代码生成程序.此外,用表格管理程序建立变量、常量和过程标识符的说明与引用之间的信息联系.用出错处理程序对词法和语法分析研究遇到的错误给出在源程序中出错的位置和错误性质.当源程序编译正确时,PL/0编译程序自动调用解释执行,并按用户程序要求输入数据和输出运行结果.(3) 各功能模块描述程序总体流程图1、 词法分析子程序分析:GetSym()函数实现词法分析的功能,它的作用是从

5、文件中读取一个单词。在GetSym()函数中调用了GetCh()。其中,GetCh()函数实现了从文件中读取一个字符的功能,同时在读取过程中忽略了空格,和回车,和制表符。其主要操作见流程图。2、 语法分析子程序分析:语法分析子程序采用了自顶向下的递归子程序法,语法分析同时也根据程序的语义生成相应三元代码,并提供了出错处理的机制。语法分析主要由:分程序分析过程BLOCK常量定义分析过程ConstDeclaration(int LEV,int &TX,int &DX)变量定义分析过程VarDeclaration(int LEV,int &TX,int &DX)语句分析程STATEMENT(SYMS

6、ET FSYS,int LEV,int &TX)表达式处理过程EXPRESSION(SYMSET FSYS, int LEV, int &TX)项处理过程TERM(SYMSET FSYS, int LEV, int &TX)因子处理过程FACTOR(SYMSET FSYS, int LEV, int &TX)条件处理过程CONDITION(SYMSET FSYS,int LEV,int &TX)构成。这些过程在结构上构成一个嵌套的层次结构。除此之外,还有:出错报告过程Error(int n)代码生成过程Gen测试单词合法性及出错恢复过程TEST(SYMSET S1, SYMSET S2, in

7、t N)登录名字表过程ENTER(OBJECTS K, int LEV, int &TX, int &DX)查询名字表函数POSITION(ALFA ID, int TX)列出类 PCODE代码过程ListCode(int CX0)作过语法分析的辅助过程。 语法分析开始后,首先调用分程序处理过程(Block)处理分程序。过程入口参数置为:0层、符号表位置0、出错恢复单词集合为句号、声明符或语句开始符。进入Block过程后,首先把局部数据段分配指针设为3,准备分配3个单元供运行期存放静态链SL、动态链DL 和返回地址RA。然后用Tx0记录下当前符号表位置并产生一条Jmp指令,准备跳转到主程序的开

8、始位置,由于当前还没有知到主程序究竟在何处开始,所以Jmp的目标暂时填为0,稍后再改。同时在符号表的当前位置记录下这个Jmp指令在代码段中的位置。在判断了嵌套层数没有超过规定的层数后,开始分析源程序。首先判断是否遇到了常量声明,如果遇到则开始常量定义,把常量存入符号表。分析完成后,生成操作数为0的OPR指令,用于从分程序返回(对于0层的主程序来说,就是程序运行完成,退出)。常量定义过程:逐个字母读取单词,反复获得标识符和对应的值,存入符号表。符号表中记录下标识符的名字和它对应的值。变量定义过程:逐个字母读取单词,存入符号表。符号表中记录下标识符的名字、它所在的层及它在所在层中的偏移地址。语句处

9、理过程:在语句处理过程中,可以处理包括+=语句、-=语句、if-else-then语句、while语句、For语句等的语句。在编译过程中,如果有begin和end语句时,就会递归调用子程序,然后通过子程序进行处理。赋值语句的处理:赋值语句首先查找赋值符号左边的标志符,查找符号表,看看这个标志符是否为变量名。然后查找赋值符号后面的数字,然后通过堆栈完成赋值操作。read语句的处理:确定read语句语法合理的前提下(否则报错),由变量的类型生成相应的指令: 对于整型,第一条是16号操作的opr指令,实现从标准输入设备上读一个整数值,放在数据栈顶。如果读入是实数就报错,第二条是sto指令,把栈顶的值

10、存入read语句括号中的变量所在的单元。对于实型,第一条是15号操作的opr指令,实现从标准输入设备上读一个实数值,放在数据栈顶。第二条是sto指令,把栈顶的值存入read语句括号中的变量所在的单元。对于字符型,第一条是20号操作的opr指令,实现从标准输入设备上读一个字符值,第二条是sto指令,把栈顶的值存入read语句括号中的变量所在的单元。write语句的处理:与read语句相似。在语法正确的前提下,生成指令:通过循环调用表达式处理过程分析write语句括号中的每一个表达式,生成相应指令保证把表达式的值算出并放到数据栈顶并生成指令,输出表达式的值,如果是数字类型则生成14号操作的opr指

11、令,如果是字符类型则生成19号操作的opr指令。if-then-else语句的处理:按if语句的语法,首先调用逻辑表达式处理过程处理if语句的条件,把相应的真假值放到数据栈顶。接下去记录下代码段分配位置(即下面生成的jpc指令的位置),然后生成条件转移jpc指令(遇0或遇假转移),转移地址未知暂时填0。然后调用语句处理过程处理 then语句后面的语句或语句块。then后的语句处理完后,如果遇到else,就调用语句处理过程处理else语句后面的语句或语句块,这时当前代码段分配指针的位置就应该是上面的jpc指令的转移位置。通过前面记录下的jpc指令的位置,把它的跳转位置改成当前的代码段指针位置,否

12、则没遇到else,那么此时的当前代码段分配指针的位置也是上面jpc指令的转移位置,也是通过前面记录下的jpc位置指令的位置,把它的跳转到当前的代码段指针位置。begin/end语句的处理:通过循环遍历begin/end语句块中的每一个语句,通过递归调用语句分析过程分析并生成相应代码。while语句的处理:首先用cx1变量记下当前代码段分配位置,作为循环的开始位置。然后处理while语句中的条件表达式生成相应代码把结果放在数据栈顶,再用cx2变量记下当前位置,生成条件转移指令,转移位置未知,填0。通过递归调用语句分析过程分析do语句后的语句或语句块并生成相应代码。最后生成一条无条件跳转指令jmp

13、,跳转到cx1所指位置,并把cx2所指的条件跳转指令的跳转位置改成当前代码段分配位置。For语句的处理:按For语句的语法,首先对For后面的一个标识符进行初值的赋值过程(类似赋值语句处理),生成相应的代码。之后遇到TO或DOWNTO保留字,如果未对应则出错。用CX1变量记下当前代码段分配的位置,作为以后JMP循环的开始位置。对上面识别的标识符变量进行存取(值在栈顶),让TO或DOWNTO后面的表达式(值在次栈顶)与之比较,生成比较指令(TO为11、DOWNTO为13),再用CX2变量记下当前代码段分配的位置,生成JPC指令,跳转地址未知,之后可用CX2记录下的位置进行回填。然后处理DO保留字

14、后的循环体,第一步递归调用语句分析过程,第二步将原先For后的标识符变量进行自加处理,生成相应代码,然后生成无条件跳转语句JMP跳转代码为CX1。最后将此时的代码段位置回填到JPC跳转指令上.4、 代码生成PL/0 处理机的指令集根据PL/0 语言的要求而设计,它包括以下的指令:(1)LIT /* 将常数置于栈顶 */(2)LOD /* 将变量值置于栈顶 */(3)STO /* 将栈顶的值赋与某变量 */(4)CAL /* 用于过程调用的指令 */(5)INT /* 在数据栈中分配存储空间 */(6)OPR /* 一组算术或逻辑运算指令 */(7)JMP, JPC /* 用于if, while 语句的条件或无条件控制转移指令 */5、 代码执行相关过程:base(),interpret()。其中base()的功能是根据层次差并从当前数据区沿着静态链查找,以便获取变量实际所在的数据区其地址;interpret()则完成各种指令的执行工作。6、错误诊断处理一个编译程序,在多数情况下,所接受的源程序正文都是有错误的。发现错误,并给出合适的诊断信息且继续编译下去从而发现更多的错误,对于编译程序而言是完全必要的。相关过程:test(), inset(), createset, uniteset(), error()。7、符号表管理为了组成一条指令,编译程序必须知道其操作码及其参数(数或地址

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 工业设计

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号