WHILE循环语句的翻译程序设计(递归下降法,输出四元式)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
武汉理工大学《数据结构》课内实践报告
学号:0121210340314
课内实践报告
课程名称编译原理
WHILE 循环语句的翻译程序设计
设计题目
(递归下降法,输出四元式)学院计算机科学与技术
专业班级计算机1203班
姓名闵丹枫
指导教师林泓
2014年12月8 日
武汉理工大学《数据结构》课内实践报告
课程设计任务书
学生姓名:闵丹枫专业班级:计算机1203班
指导教师:林泓工作单位:计算机科学与技术学院
题目:WHILE循环语句的翻译程序设计(递归下降法、输出四元式)
初始条件:
理论:学完编译课程,掌握一种计算机高级语言的使用。
实践:计算机实验室提供计算机及软件环境。如果自己有计算机可以在其上进行设计。
要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)
(1)写出符合给定的语法分析方法的文法及属性文法。
(2)完成题目要求的中间代码四元式的描述。
(3)写出给定的语法分析方法的思想,完成语法分析和语义分析程序设计。
(4)编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。
(5)设计报告格式按附件要求书写。课程设计报告书正文的内容应包括:1系统描述(问题域描述);
2文法及属性文法的描述;
3语法分析方法描述及语法分析表设计;
4按给定的题目给出中间代码形式的描述及中间代码序列的结构设计;
5编译系统的概要设计;
6详细的算法描述(流程图或伪代码);
7软件的测试方法和测试结果;
8研制报告(研制过程,本设计的评价、特点、不足、收获与体会等)
9参考文献(按公开发表的规范书写)。
时间安排:
设计安排一周:周1、周2:完成系统分析及设计。
周3、周4:完成程序调试及测试。
周5:撰写课程设计报告。
设计验收安排:设计周的星期五第1节课开始到实验室进行上机验收。
设计报告书收取时间:设计周的次周星期一上午10点。
指导教师签名: 2014 年9月1日
WHILE循环语句的翻译程序设计(递归下降法、输出四元式)
一.系统描述
1.1问题描述
设计一个WHIL B布尔表达式〉DO〈赋值语句〉循环语句的词法、语法及语义分析程序,语法分析选择递归下降法,采用用语法制导翻译输出中间代码四元式。
1.2主要任务
设计一个能识别while循环语句的文法,消除左递归,使文法符合LL(1)文法。利用递归下降法编写一个集词法分析,语法分析和语义分析为一体的程序。该程序首先可以检查输入语句是否符合词法要求,若符合则继续识别输入的语句是否符合while语句的文法,若符
合则进行语义分析,输出用四地址代码表示的中间代码。
文法及属性文法的描述
2.1文法的描述
扩充巴科斯-瑙尔范式(EBNF :
vwhile语句> ::=while (< 条件语句>)do{ < 赋值语句> }
<条件语句> ::= < 表达式><条件运算符> < 表达式>
< 表达式> ::= < 表达式> + <表达式2> | < 表达式> - < 表达式2> | < 表达式2>
<表达式2>::=<表达式2> * <表达式3> |<表达式2> / <表达式3> | <表达式3>
<表达式3>::=(<表达式>)| <标识符>|<数字>
<赋值语句>::=< 标识符>=<表达式>;
根据以上写出来的While循环语句的文法表示如下:
1. S -> while (A) do {B}
2. A -> CDC
3. D -> > | = | < | >= |<=
4. C -> C+E | C-E | E
5. E -> E*F | E/F | E
6. F -> (C) | i | n
对以上文法消除左递归,最后得到的文法为:
1. S->while (A) do {B}
2. A->CDC
3. D-> > | = | < | >= | <=
4. C->EG
5. G->+EG | -EG | &
6. E->FH
7. H->*FH | / F H | &
8. F->(C) | i | n
9. B->i=C;
2.1属性文法的描述
(1)任一非终结符B都不是左递归的,否则会产生死循环。
⑵对 A 的任意两个右部B i , B j ,有:first( B i) A first( B j)= ©, First( B i)表B i所能导出串的第一个符号的集合。显然,每个 B i的first( B i)是互不相同的,否则则
无法判断应执行哪个( i )
C-->EG{C.PIace:=n ewtemp;
Emit(C.PIace':='E.PIace G.place)}
G->+EG{G.Place:=newtemp;
Emit(G1.Place':=''+'E.Place G2.place)}
G->-EG{G.Place:=newtemp;
Emit(G1.Place':=''-'E.Place G2.place)}
G-> £
{G.Place:=newtemp; Emit(G.Place':='''}
H->*FH{H.Place:=newtemp;
Emit(H1.Place':=''*'F.Place H2.place)}
H-> / FH{H.Place:=newtemp;
Emit(H1.Place':=''+'F.Place H2.place)}
H-> £{G.Place:=newtemp;
Emit(H1.Place':=''+'E.Place H2.place)}
F->(C){F.Place:=C.Place}
B->i=C;
{p:=lookup(i. name) If p!=nil the n Emit(p':='C.PIace Else
error)}
语法分析方法描述
3. 1语法分析方法描述
递归下降法是一种比较简单直观,易于构造的语法分析方法。他要求文法满足LL( 1) 文法,他的设计思想是对应文法中每个非终结符编写一个递归过程,每个过程的功能是识别由该非终结符推出的单词(或串),当某非终结符的产生式有多个候选时,能够按LL (1) 形式可唯一地确定选择某个候选进行推导。
它的优点是简单直观,易于构造,很多编译系统所实现
缺点是对文法要求很高,由于递归调用多,影响分析器的效率。
递归下降程序是由一组子程序组成,每个子程序对应于一个非终结(S,A,B,C,D,E,F,G,H) 每个子程序处理相应句型中相对于此非终结符号的产生式。在定义文法时,是递归定义的,所以这些子程序也是递归的。当一个子程序调用另一个子程序时,原子程序顺序执行语句,即总是先执行被调用的子程序,然后再执行后继的程序。程序中9个子程序,其中S是开始
符号,也是递归下降分析的入口,通过调用词法分析器进行单词分析,并通过
word=I.Yufa_Queue.fro nt() 来得到当前所分析到的单词,然后在递归语法分析中根据这个单词分析下一步要执行的子程序。其中要注意的是,当子程序G()和H()中出现匹配的是空字符串时,不做