编译课设报告pl0编译器的中间代码生成2

上传人:M****1 文档编号:431097399 上传时间:2023-04-10 格式:DOC 页数:23 大小:2.98MB
返回 下载 相关 举报
编译课设报告pl0编译器的中间代码生成2_第1页
第1页 / 共23页
编译课设报告pl0编译器的中间代码生成2_第2页
第2页 / 共23页
编译课设报告pl0编译器的中间代码生成2_第3页
第3页 / 共23页
编译课设报告pl0编译器的中间代码生成2_第4页
第4页 / 共23页
编译课设报告pl0编译器的中间代码生成2_第5页
第5页 / 共23页
点击查看更多>>
资源描述

《编译课设报告pl0编译器的中间代码生成2》由会员分享,可在线阅读,更多相关《编译课设报告pl0编译器的中间代码生成2(23页珍藏版)》请在金锄头文库上搜索。

1、 课程设计报告 ( 年度第一学期)名 称: 编译技术课程设计 题 目: PL/0语言编译器的中间代码生成院 系: 班 级: 学 号: 学生姓名: 指导教师: 设计周数: 一周 成 绩: 日期: 年 月 日 1 课程设计的目的和要求1.1 课程设计的目的本次设计的时间为1周,目的是通过使用高级语言实现部分算法加强对编译技术和理论的理解。设计的题目要求具有一定的规模,应涵盖本课程内容和实际应用相关的主要技术,同时使大家将理论与实际应用结合起来,受到软件设计等开发过程的全面训练,从而提高软件开发的能力。1.2 课程设计的要求1、要求用递归子程序法/或预测分析法实现对表达式、各种说明语句、控制语句进行

2、语法分析。2、若语法正确,则用语法制导翻译法进行语义翻译:对说明语句,要求将说明的各符号记录到相应符号表中;对可执行语句,应产生出四元式中间代码并填写到三地址码表中;3、若语法错误,要求指出出错性质和出错位置(行号)。出错处理应设计成一个出错处理子程序。2 系统描述PL/0的编译程序和目标程序的解释执行程序都是用JAVA语言书写的,因此PL/0语言可在配备JAVA语言的任何机器上实现。本次课设开发平台即为JAVA。用递归子程序法实现了对表达式、各种说明语句、控制语句进行语法的分析。其中,对各个变量符号保存到了符号表中。对可执行语句,转化成四元式中间代码进行输出。本程序中,通过出错处理子程序,也

3、进行了语法的错误的记录,并且输出了出错的行号和出错原因。该程序的输入是打开test文件,通过文件输入流读入,输出有生成的中间代码、符号表内容、错误分析三部分内容,分别用java界面控件显示出来。2.1 PL/0语言的描述PL/0语言的编译程序是一个编译解释执行系统。PL/0的目标程序为假想栈式计算机的汇编语言,与具体计算机无关。其编译过程采用一趟扫描方式,以语法分析类为核心,词法分析和代码生成类都作为一个独立的类,当语法分析需要读单词时就调用词法分析程序,而当语法分析正确需要生成相应的目标代码时,则调用代码生成程序。用表格管理程序建立变量、常量和过程表示符的说明与引用之间的信息联系。用出错处理

4、程序对词法和语法分析遇到的错误给出在源程序中出错的位置和错位性质。当源程序编译正确时,PL/0编译程序自动调用解释执行程序,对目标代码进行解释执行,并按用户程序的要求输入数据和输出运行结果。2.2 PL/0文法的描述在计算机科学中,文法是编译原理的基础,是描述一门程序设计语言和实现其编译器的方法。文法的描述多用BNF(巴克斯范式),而另一个重要的概念:正则表达式,也是文法的另一种形式。PL/0文法的EBNF表示::= .:= := const,;:= =:= := |:= var, ;:= ;:= procedure;:= | := := := +|-:= := | ( ) := +|-:=

5、*|/:= |odd:= =|=:= ifthen:= whiledo := call := begin;end:= read ( , ) := write ( , ) := a|b|c|d.x|y|z := 0|1|2|3.8|92.3 PL/0语法描述图图2-3-1 程序语法描述图图2-3-2 分程序语法描述图图2-3-3 语句语法描述图2-3-4 条件语句描述图图2-3-5 表达式语法描述图2-3-6 项语法描述图2-3-7 因子语法描述3 概要设计3.1 概要设计(体现系统的设计思路和主要功能)该编译器采用JAVA语言编写,共采用了七个类,48个方法(函数)用来功能实现,其中pl0类为

6、main方法所在的类,是整个编译主程序类和主界面框架类。getsym类为编译器的词法分析类和block类为编译器的语法分析类,为整个程序的核心所在。系统设计思路如图3-1。主程序词法分析源程序输入程序运行输出语法分析中间代码生成表格管理程序出错处理程序图3-1 系统设计思路图主要功能设计:首先在源程序相同的目录下创建test文件,并在文档中输入需要编译的程序语句,然后定义一个输入流文件,利用打开(button)按钮打开需要编译的文件,在调用初始化各种变量的初始化函数。接着开始进行词法分析,词法分析程序的主要任务是对构成源程序的字符串从左到右的扫描,逐个字符地读入源程序字符并按照构词规则切分成一

7、个一个具有独立意义的单词。并确定其属性(如保留字、标识符、运算符、界限符和常量等)。词法分析是编译过程中的第一个阶段,在语法分析前进行 。也可以和语法分析结合在一起作为一遍,由语法分析程序调用词法分析程序来获得当前单词供语法分析使用。在语法分析过程中,将变量符号存入符号表中,语法分析完了之后就是打印中间代码的四元式形式。下表为一些主要函数方法的功能及其组织结构。(如表1)表3-1 PL/0的各类及其方法的功能简单描述PL/0编译器用到的类及其方法功能简单介绍Pl0类主程序类 Main()方法程序入口Getsym类词法分析列,用于显示错误行号、类型号和内容 Getsym()方法构造函数,定义保留

8、字表;由文件名,建立一个输入流。 GetErroNumber()方法用于返回词法分析时发生的错误个数 GetCh()方法在原文件中读取一个符号 GetToken()方法将读取的符号组合成一个单词tokenBlock类语法分析类,查出错误,生成四元式 Block()方法构造函数,接收一个词法分析对象 GetErroNumber()方法返回语法分析时发生的错误个数Analyse()方法语法分程序分析,是最主要的函数 Declaration()方法常量声明的方法Vardeclaration()方法变量声明的方法 Enter()方法注册名字表 Position()方法查找符号表 Statement()

9、方法语句的分析处理 Condition()方法条件分析 Expression()方法表达式的处理 Term()方法项的处理 Factor()方法因子的分析处理 printName()方法查看符号表内容 printCode()方法midcode的显示方法 Newtemp()方法临时变量方法,记录中间变量并递增 Backtemp()方法记录中间变量并递减Token类 用于存放读取的token单词 Token()方法构造函数 setLineNum()方法设置token对象的行号 getLineNum()方法返回token对象的行号 getNam()方法返回token对象的内容 getSym()方法返

10、回token对象的类型Error类错误处理类 getLinenumber()方法获得错误的行号 setLinenumber()方法设置错误的行号 geterrorString ()方法获得错误的原因 Error()方法构造函数nameClass类用于表示符号类,存放于符号表中 nameClass()方法构造函数 setAdr()方法设置符号adr属性 getAdr()方法获得符号adr属性 getKind()方法返回符号kind属性 getVal()方法返回符号val属性 getLev()方法返回符号lev属性Midcode类midcode类 表示midcode指令 Midcode()方法构造

11、函数 Setresult()方法设置结果-中间参数 Getop()方法获得操作码 getarg1()方法获得第一个操作数 getarg2()方法获得第二个操作数 Getresult()方法获得结果-中间参数3.2 系统用例图图3-2 系统用例图3.3 系统用例此编译器系统共有两个面向用户的用例,导入程序用例和分析PL/0程序用例。其中分析PL/0程序用例中又包含了词法分析用例、语法分析用例、和生成四元式用例。3.4 开发环境在JAVA开发环境下实现PL/0中间代码(四元式)生成编译器。4 详细设计4.1 系统的类图图 4-1-1 系统类图4.2 主要算法的流程图 输出数据 词法分析程序表格管理程序语法分析程序中间代码生成程序出错处理程序PL/0主执行程序PL/0源程序表示子程序表示数据流表示调用关系图4-2-1 PL/0编译程序的结构图开始置初值调用getsym获取单词调用block过程进行分析当前单词是否是源程序结束符“.”?当前单词是否是源程序结束符“.”?输出中间代码四元式和符号表至界面结束出错打印错误YN图4-2-2 PL/0编译程序总体流程图getsymk=0ch=空?getchch是数字?ch是字母?k10?ak=chk=k+1拼数,将拼数后的值送num symnumber把该字符转换成对应单词,或拼复合单词,将其类别送

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

当前位置:首页 > 大杂烩/其它

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