WHILE语句的翻译—递归子程序法—三地址表示——编译原理课程设计报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计
题目WHILE循环语句的翻译程序设计
(递归下降法、输出三地址表示)学院计算机科学与技术学院
专业计算机科学与技术
班级0806
姓名张方纪
指导教师郭羽成
2010 年 1 月7 日
课程设计任务书
学生姓名:张方纪专业班级:计算机0806班
指导教师:郭羽成工作单位:计算机科学与技术学院
题目: WHILE循环语句的翻译程序设计(递归下降法、输出三地址表示)初始条件:
理论:学完编译课程,掌握一种计算机高级语言的使用。
实践:计算机实验室提供计算机及软件环境。如果自己有计算机可以在其上进行设计。
要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)
(1)写出符合给定的语法分析方法的文法及属性文法。
(2)完成题目要求的中间代码三地址表示的描述。
(3)写出给定的语法分析方法的思想,完成语法分析和语义分析程序设计。
(4)编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。
(5)设计报告格式按附件要求书写。课程设计报告书正文的内容应包括:
1 系统描述(问题域描述);
2 文法及属性文法的描述;
3 语法分析方法描述及语法分析表设计;
4 按给定的题目给出中间代码形式的描述及中间代码序列的结构设计;
5 编译系统的概要设计;
6 详细的算法描述(流程图或伪代码);
7 软件的测试方法和测试结果;
8 研制报告(研制过程,本设计的评价、特点、不足、收获与体会等);
9 参考文献(按公开发表的规范书写)。
时间安排:
设计安排一周:周1、周2:完成系统分析及设计。
周3、周4:完成程序调试及测试。
周5:撰写课程设计报告。
设计验收安排:设计周的星期五第1节课开始到实验室进行上机验收。
设计报告书收取时间:设计周的次周星期一上午10点。
指导教师签名: 2010年 11月 23日
系主任(或责任教师)签名: 2010年 11月 23日
WHILE循环语句的翻译程序设计
(递归下降法、输出三地址表示)
1任务
使用C++语言编写一个while循环语句的翻译程序,使用递归下降法进行语法分析,输出三地址码表示。
2实施
2.1初步理解研究对象
选取C++语言的一个子集——简化了的while循环语句语言。这样用文字描述它的各级组成:
●语句(非终极符表示):
⏹While循环语句W
⏹赋值语句E
●表达式(非终极符表示):
⏹逻辑表达式L 运算符:&&、||、!
⏹关系表达式R 运算符:>、<、= =、>= 、<= 、!=
⏹算术表达式A 运算符:+、-、*、/、%
●单词(终极符表示):
⏹标识符i
⏹实常数c
⏹三种表达式所用的运算符
◆逻辑或与非:v、^、!
◆关系运算符r
◆算术运算符+、*
⏹括号(、)
⏹花括号{、}
⏹分号;
说明:
2.1.1.1最外层必须是一while语句。
2.1.1.2While判断条件可以是任何上述语言所涵盖的能求出值来的表达式、标识符或实
常数。
2.1.1.3while循环体内的语句可以是零个或多个赋值语句或while语句的任意排列。
2.1.1.4对代码的空白、程序段长度没有任何不合理限制。
2.2所研究语言的文法描述
文法G[W]的定义见表1
注:1) 共18个非终极符。已经消除左递归。具有相同左部的产生式Select集为空,属LL(1)型文法;
2) “栈“指的是程序为接受语法分析过程吸收的单词序列二专设的一个对象,它的入栈动作伴随着中间代码的生成;
3) 每一个能够吸收单词的文法所吸收单词不同的入栈顺序和时机决定入栈单词序列的代码形式——前缀式、中缀式、后缀式,本文采用后缀式,其优越性是不容置疑的。
表1附表1:非终极符的First集和Follow集(供求产生式的Select集)
2.3递归下降法
递归下降法又叫递归子程序法,他是比较简单直观且易于构造的一种语法分析方法。
它首先要求文法必须符合LL(1)型,表1我们所构造的文法消除了左递归,经求Select 集,发现符合LL(1)文法要求。
使用递归子程序法,为每一个非终极符构造一个(最好是同名的)语法分析子程序。
它首先看经词法分析过的单词流流首字符是否为其某一产生式的Select集元素,是则从左到右依次CHECK或CALL。所谓的CHECK是指,如果当前产生式右部的当前字符是终极符,只需拿它和当前流首字符比较,若不等则语法分析失败,否则继续下一个CHECK或CALL;所谓的CALL,是指如果当前产生式右部的当前字符是非终极符,只需调用其对应的语法分析程序,若返回失败则语法分析失败,否则继续下一个CHECK或CALL。
CHECK和CALL的宏定义如下:
#define CHECK(chrVal) if(vts.peek()!=chrVal)return false;toNextWord(vts,word)
#define CALL(Proc) if(! Proc(vts,ac))return false
#define ELSE(Proc) else{cout<<"\nError in "<<#Proc< 之所以CHECK的参数没有直接用非终极符或终极符,而是用其对应的ASCII码,是因为括号不可以作为宏的参数,即不能写成CHECK(();而字母作为其参数,目标串中引号内与参数相同的字符(串)无法被实参替换。这点困难应该有解决办法(笔者的,算是下策了),就抛砖引玉,留给后人解决。 递归子程序法的编制是极其直观的,很多非终极符的子程序都很相似,甚至只相差一两个字符。根据给定文法自动生成递归子程序是完全可能的。限于时间关系,本文只采用宏定义实现了初级自动化,使得递归子程序的内容相当简单清晰。一个典型非终极符的语法分析子程序,如图1所示。 图1 一个典型非终极符的语法分析子程序 其实,在着力描述语法分析的过程中,我们无意中忽略了词法分析。它门槛相对较低一些,因为标识符的构成方法都还简单,不如本文中的句子的文法构成之复杂。但它们为后面的语法分析是提供了极大的支持的。我们将’+’,’-‘都标识为’+’,将’*’,’/’,’%’都标识为’*’,将所有关系运算符统一用’r’标识,对于简化文法时意义重大的。一类典型单词——标识符的词法分析子程序,如图2所示。