PL0语言编译器的中间代码生成
课程设计报告 ( 2016--2017年度第一学期) 名 称: 编译技术课程设计 题 目: PL/0语言编译器的中间代码生成 院 系: 控制与计算机工程 班 级: 信安1401 学 号: 学生姓名: 黄竞昶 指导教师: 徐欢 设计周数: 一周 成 绩: 日期:2016年 12 月29日 1 课程设计的目的和要求 1.1 课程设计的目的 本次设计的时间为1周,目的是通过使用高级语言实现部分算法加强对编译技术和理论的理解。设计的题目要求具有一定的规模,应涵盖本课程内容和实际应用相关的主要技术。 1.2 课程设计的要求 1、要求用递归子程序法/或预测分析法实现对表达式、各种说明语句、控制语句进行语法分析。 2、若语法正确,则用语法制导翻译法进行语义翻译:对说明语句,要求将说明的各符号记录到相应符号表中;对可执行语句,应产生出四元式中间代码并填写到三地址码表中; 3、若语法错误,要求指出出错性质和出错位置(行号)。出错处理应设计成一个出错处理子程序。 2 系统描述 PL/0的编译程序和目标程序的解释执行程序都是用JAVA语言书写的,因此PL/0语言可在配备JAVA语言的任何机器上实现。本次课设开发平台即为JAVA。用递归子程序法实现了对表达式、各种说明语句、控制语句进行语法的分析。其中,对各个变量符号保存到了符号表中。对可执行语句,转化成四元式中间代码进行输出。本程序中,通过出错处理子程序,也进行了语法的错误的记录,并且输出了出错的行号和出错原因。 该程序的输入是打开test文件,通过文件输入流读入,输出有生成的中间代码、符号表内容、错误分析三部分内容,分别用java界面控件显示出来。 2.1 文法的描述 在计算机科学中,文法是编译原理的基础,是描述一门程序设计语言和实现其编译器的方法。文法的描述多用BNF(巴克斯范式),而另一个重要的概念:正则表达式,也是文法的另一种形式。 PL/0文法的EBNF表示: ::= . ::= [][][] ::= const{,}; ::= = ::= {} ::= {|} ::= var{, }; ::= {;} ::= procedure; ::= ||| |||| ::= := ::= [+|-]{} ::= {} ::= || ‘ ( ’ ‘ ) ’ ::= +|- ::= *|/ ::= |odd ::= =||= ::= ifthen ::= whiledo ::= call ::= begin{;}end ::= read ‘ ( ’{, } ‘ ) ’ ::= write ‘ ( ’{, } ‘ ) ’ ::= a|b|c|d…x|y|z ::= 0|1|2|3….8|9 3 概要设计 3.1 概要设计(体现系统的设计思路和主要功能) 首先在源程序相同的目录下创建一个txt文档,并在文档中输入需要编译的程序即if-else语句,然后定义一个输入流文件,利用这个流文件中的open函数打开我需要编译的txt文件,在调用初始化各种变量的初始化函数。 接着开始进行词法分析,词法分析程序的主要任务是对构成源程序的字符串从左到右的扫描,逐个字符地读入源程序字符并按照构词规则切分成一个一个具有独立意义的单词。并确定其属性(如保留字、标识符、运算符、界限符和常量等)。再把它们转换成长度统一的标准形式—属性字。 词法分析是编译过程中的第一个阶段,在语法分析前进行 。也可以和语法分析结合在一起作为一遍,由语法分析程序调用词法分析程序来获得当前单词供语法分析使用。 单词的分类(五类): 1. 关键字:由程序语言定义的具有固定意义的标识符。也称为保留字或基本字。 2. 标识符:用来表示程序中各种名字的字符串。 3. 常 数:常数的类型一般有整型、实型、布尔型、文字型。 4. 运算符:如+、- 、*、/ 等。 5. 界限符:如逗号、分号、括号等。 但是我做的这个实验没有用到那么多东西,词法分析的有效字符串为: IF,ELSE,THEN, ,.=,=,和从a到z的单个标识符,但是程序还是相对来说比较简单,复杂的表达式可能不能处理,以后会改进。而词法分析的结果就是将相应的单词赋予不同的属性值,利用词法分析表将结果保存起来,为后面的语义分析做准备。词法分析完成之后就是把词法分析的结果都显示出来。 语法分析的过程在上面已经有了说明,语法分析完了之后就是打印中间代码的三地址形式,根据上面的结果,三地址的数组里面已经存储了编译的具体信息,之需要按照相应的算符,将他们输出出来,即可看到中间代码的三地址表示形式。 3.2 系统用例图【必须有】 图3-1 系统用例图 3.3 系统用例 此编译器系统共有两个面向用户的用例,导入程序用例和分析PL/0程序用例。其中分析PL/0程序用例中又包含了词法分析用例、语法分析用例、和生成四元式用例。 3.4 开发环境 在JAVA开发环境下实现PL/0中间代码(四元式)生成编译器。 4 详细设计 4.1 系统的类图 4.2 主要算法的流程图 输出数据 词法分析程序 表 格 管 理 程 序 语法分析程序 中间代码生成程序 出 错 处 理 程 序 PL/0主执行程序 PL/0源程序 表示子程序 表示数据流 表示调用关系 4.3 数据分析与定义 1、token类 用于存放读取的token单词 class token{ private String