PL0语言编译器的中间代码生成 下载本文

课程设计报告

( 2016--2017年度第一学期)

名 称: 编译技术课程设计 题 目: PL/0语言编译器的中间代码生成 院 系: 控制与计算机工程 班 级: 信安1401 学 号: 1141290105 学生姓名: 黄竞昶 指导教师: 徐欢 设计周数: 一周

成 绩:

日期: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<常量定义>{,<常量定义>};

2

课程设计报告

<常量定义>::= <标识符>=<无符号整数> <无符号整数>::= <数字>{<数字>} <标识符>::= <字母>{<字母>|<数字>} <变量说明部分>::= var<标识符>{, <标识符>};

<过程说明部分>::= <过程首部><分程序>{;<过程说明部分>} <过程首部>::= procedure<标识符>;

<语句> ::= <赋值语句>|<条件语句>|<当循环语句>|<过程调用语句> |<复合语句>|<读语句>|<写语句>|<空> <赋值语句>::= <标识符> := <表达式> <表达式> ::= [+|-]<项>{<加法运算符><项>} <项>::= <因子>{<乘法运算符><因子>}

<因子>::= <标识符>|<无符号整数>| ‘ ( ’ <表达式> ‘ ) ’ <加法运算符>::= +|- <乘法运算符>::= *|/

<条件>::= <表达式><关系运算符><表达式>|odd<表达式> <关系运算符>::= =|<>|<|<=|>|>= <条件语句>::= if<条件>then<语句> <当循环语句>::= while<条件>do<语句> <过程调用语句>::= 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文件,在调用初始化各种变量的初始化函数。

接着开始进行词法分析,词法分析程序的主要任务是对构成源程序的字符串从左到右的扫描,逐个字符地读入源程序字符并按照构词规则切分成一个一个具有独立意义的单词。并确定其属性(如保留字、标识符、运算符、界限符和常量等)。再把它们转换成长度统一的标

3