首页 WHILE循环语句的翻译程序设计(递归下降法,输出四元式)

WHILE循环语句的翻译程序设计(递归下降法,输出四元式)

举报
开通vip

WHILE循环语句的翻译程序设计(递归下降法,输出四元式) 学 号: 0121210340314     课内实践报告 课程名称 编译原理 设计题目 WHILE循环语句的翻译程序设计(递归下降法,输出四元式) 学院 计算机科学与技术 专业班级 计算机1203班 姓名 闵丹枫 指导教师 林泓     2014 年 12 月 8 日             课程设计任务书 学生姓名: 闵丹枫        专业班级:    计算机1203班      指导教师: 林  泓    工作单位...

WHILE循环语句的翻译程序设计(递归下降法,输出四元式)
学 号: 0121210340314     课内实践报告 课程名称 编译原理 设计 快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题 目 WHILE循环语句的翻译程序设计(递归下降法,输出四元式) 学院 计算机科学与技术 专业班级 计算机1203班 姓名 闵丹枫 指导教师 林泓     2014 年 12 月 8 日             课程设计任务书 学生姓名: 闵丹枫        专业班级:    计算机1203班      指导教师: 林  泓    工作单位:计算机科学与技术学院 题目: WHILE循环语句的翻译程序设计(递归下降法、输出四元式) 初始条件: 理论:学完编译课程,掌握一种计算机高级语言的使用。 实践:计算机实验室提供计算机及软件环境。如果自己有计算机可以在其上进行设计。 要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰写等具体要求) (1) 写出符合给定的语法分析 方法 快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载 的文法及属性文法。 (2) 完成题目要求的中间代码四元式的描述。 (3) 写出给定的语法分析方法的思想,完成语法分析和语义分析程序设计。 (4) 编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。 (5) 设计报告格式按附件要求书写。课程设计报告书正文的内容应包括: 1 系统描述(问题域描述); 2 文法及属性文法的描述; 3 语法分析方法描述及语法分析表设计; 4 按给定的题目给出中间代码形式的描述及中间代码序列的结构设计; 5 编译系统的概要设计; 6 详细的算法描述(流程图或伪代码); 7 软件的测试方法和测试结果; 8 研制报告(研制过程,本设计的 评价 LEC评价法下载LEC评价法下载评价量规免费下载学院评价表文档下载学院评价表文档下载 、特点、不足、收获与体会等); 9 参考文献(按公开发表的 规范 编程规范下载gsp规范下载钢格栅规范下载警徽规范下载建设厅规范下载 书写)。 时间安排: 设计安排一周:周1、周2:完成系统分析及设计。 周3、周4:完成程序调试及测试。 周5:撰写课程设计报告。 设计验收安排:设计周的星期五第1节课开始到实验室进行上机验收。 设计报告书收取时间:设计周的次周星期一上午10点。 指导教师签名:                            2014年 9月 1日 系主任(或责任教师)签名:                2014年  月  日 WHILE循环语句的翻译程序设计(递归下降法、输出四元式) 一. 系统描述 1.1问题描述 设计一个WHILE〈布尔表达式〉DO〈赋值语句〉循环语句的词法﹑语法及语义分析程序,语法分析选择递归下降法,采用用语法制导翻译输出中间代码四元式。 1.2主要任务 设计一个能识别WHILE循环语句的文法,消除左递归,使文法符合LL(1)文法。利用递归下降法编写一个集词法分析,语法分析和语义分析为一体的程序。该程序首先可以检查输入语句是否符合词法要求,若符合则继续识别输入的语句是否符合while语句的文法,若符合则进行语义分析,输出用四地址代码表示的中间代码。 二. 文法及属性文法的描述 2.1 文法的描述 扩充巴科斯-瑙尔范式(EBNF): ::= 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 | / FH  | ε 8.F->(C) | i | n                9.B->i=C; 2.1属性文法的描述 (1)任一非终结符B都不是左递归的,否则会产生死循环。 (2)对A的任意两个右部βi , βj ,有:first(βi)∩first(βj)=φ, First(βi)表βi所能导出串的第一个符号的集合。显然,每个βi的first(βi)是互不相同的,否则则无法判断应执行哪个ζ(βi )。 产生式 语义规则 S-->while (A) do {B} {S.first:=newtemp; S.second:=newtemp; A.true:=newtemp; emit(A.false:=S.second; S1.second:=S.first; S.place:=(S.begin, ‘:’) || B.place ||printf(S.true, ‘:’) ||S1.place || printf(‘goto’,S.begin) || printf(B.false, ‘:’) || printf(‘gotoLnext’);)} A-->CDC {A.place:=newpemt; emit(A.place':='C1.place D.place C2.place)} .D-->> {D.place:=newtemp ; Emit(D.Place':=''>')} .D-->< {D.place:=newtemp ; Emit(D.Place':=''<')} .D--> = {D.place:=newtemp ; Emit(D.Place':=''=')} .D-->>= {D.place:=newtemp ; Emit(D.Place':=''>=')} .D--><= {D.place:=newtemp ; Emit(D.Place':=''<=')} C-->EG {C.Place:=newtemp; Emit(C.Place':='E.PlaceG.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 then Emit(p':='C.Place Else error)}     三. 语法分析方法描述 3.1语法分析方法描述 递归下降法是一种比较简单直观,易于构造的语法分析方法。他要求文法满足LL(1)文法,他的设计思想是对应文法中每个非终结符编写一个递归过程,每个过程的功能是识别由该非终结符推出的单词(或串),当某非终结符的产生式有多个候选时,能够按LL(1)形式可唯一地确定选择某个候选进行推导。 它的优点是简单直观,易于构造,很多编译系统所实现 缺点是对文法要求很高,由于递归调用多,影响分析器的效率。 递归下降程序是由一组子程序组成,每个子程序对应于一个非终结(S,A,B,C,D,E,F,G,H)。每个子程序处理相应句型中相对于此非终结符号的产生式。在定义文法时,是递归定义的,所以这些子程序也是递归的。当一个子程序调用另一个子程序时,原子程序顺序执行语句,即总是先执行被调用的子程序,然后再执行后继的程序。程序中9个子程序,其中S 是开始符号,也是递归下降分析的入口,通过调用词法分析器进行单词分析,并通过word=l.Yufa_Queue.front()来得到当前所分析到的单词,然后在递归语法分析中根据这个单词分析下一步要执行的子程序。其中要注意的是,当子程序G()和H()中出现匹配的是空字符串时,不做单词处理,该所取得的单词,应该为下一个匹配产生做准备。 3.2递归下降法实现的原理 设A是一个非终结符:A→β1 A→β2 ┊ A→βn 则写    ζ(A)   if char∈first(β1 )  thenζ(β1 ) else if char∈first(β2 )  then ζ(β2 ) else… ifchar∈first(βn ) then ζ(βn) else    ERROR 其中ζ(βi)表示调用处理符号串βi的子程序。 对A的任一右部i 设为:βi = y1 y2 … yn 则定义ζ( βi)   beginζ(y1);ζ(y2);…;ζ(yn) end 其中yj可分为下列两种情况(j=1,…,n): 1)  yj∈VT,则 ζ( yj)   if char≠yj  then  ERROR  else    READ(char) 2)  yj∈VN,则ζ(yj)表示调用关于yj的递归子程序。 四.中间代码形式的描述及中间代码序列的结构设计 4.1四元式形式 中间代码为四元式,按照要求,要输出四元式一个四元式是一个带有四个域的记录结构,这四个域分别称为op﹑arg1﹑arg2及result。域op包含一个代表运算符的内部码。语句while aaFb if ((temp[sign] >= 'a' && temp[sign] <= 'z') || (temp[sign] > 'A' && temp[sign] <= 'Z')){ cout<< "(" ; sign++; Do_F(temp); } else{ cout<< "()中含有非法字符!" << | = | > | <= | >= voidDo_F(string temp){            //F ->< | = | > | <= | >= intf_sign = sign; if (temp[f_sign] == '<' || temp[f_sign] == '=' || temp[f_sign] == '>'){ if (temp[f_sign + 1] == '='){ cout<< temp[f_sign + 1]<<","; if ((temp[f_sign + 2] >= 'a' && temp[f_sign + 2] <= 'z') || (temp[f_sign + 2] > 'A' && temp[f_sign + 2] <= 'Z')){ cout<= 'a' && temp[f_sign + 1] <= 'z') || (temp[f_sign + 1] > 'A' && temp[f_sign + 1] <= 'Z')){ cout< c=R void Do_G(string temp){    //G-> c=R  赋值表达式 int p[MAX]; intlen = temp.size() + 1; charch = 'a'; int c = -1, q = 0; while (temp[sign] != ';' && sign = 'A'&&ch<= 'Z') { for (int l = 0; l= 'A'&&str[e] <= 'Z') { for (inti = 0; i