您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > DO-WHILE循环语句的翻译程序设计
武汉理工大学《编译原理》课程设计说明书1课程设计任务书学生姓名:专业班级:指导教师:工作单位:计算机科学与技术学院题目:DO-WHILE循环语句的翻译程序设计(LL(1)法、输出三地址表示)初始条件:理论:学完编译课程,掌握一种计算机高级语言的使用。实践:计算机实验室提供计算机及软件环境。如果自己有计算机可以在其上进行设计。要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)(1)写出符合给定的语法分析方法的文法及属性文法。(2)完成题目要求的中间代码三地址表示的描述。(3)写出给定的语法分析方法的思想,完成语法分析和语义分析程序设计。(4)编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。(5)设计报告格式按附件要求书写。课程设计报告书正文的内容应包括:1系统描述(问题域描述);2文法及属性文法的描述;3语法分析方法描述及语法分析表设计;4按给定的题目给出中间代码形式的描述及中间代码序列的结构设计;5编译系统的概要设计;6详细的算法描述(流程图或伪代码);7软件的测试方法和测试结果;8研制报告(研制过程,本设计的评价、特点、不足、收获与体会等);9参考文献(按公开发表的规范书写)。时间安排:设计安排一周:周1、周2:完成系统分析及设计。周3、周4:完成程序调试及测试。周5:撰写课程设计报告。设计验收安排:设计周的星期五第1节课开始到实验室进行上机验收。设计报告书收取时间:设计周的次周星期一上午10点。指导教师签名:2011年月日系主任(或责任教师)签名:2011年月日武汉理工大学《编译原理》课程设计说明书2DO-WHILE循环语句的翻译程序设计(LL(1)法、输出三地址表示)1.系统描述1.1设计目的通过设计、编制、调试一个DO-WHILE循环语句的语法及语义分析程序,加深对法及语义分析原理的理解,并实现词法分析程序对单词序列的词法检查和分析。1.2设计内容及步骤对循环语句:DO〈赋值语句〉WHILE〈表达式〉(1)按给定的题目写出符合自身语法分析方法要求的文法和属性文法描述。(2)按给定的题目给出语法分析方法的思想及分析表设计。(3)按给定的题目给出中间代码序列的结构设计。(4)完成相应的词法分析、语法分析和语义分析程序设计。(5)编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。2.文法及属性文法的描述2.1文法描述K-doLwhileSL-SPP-;SP|εS-iQEE-TGG-+TG|-TG|εT-FRR-*FR|/FR|εF-(E)|iQ-=||2.2属性文法的描述产生式属性文法K-doLwhileSK.begin:=newlabel;K.next:=newlabel;S.true:=newlabel;S.false:=K.next;L.next:=K.begin;K.code:=gen(K.begin,‘:’)||S.code||gen(K.true,‘:’)武汉理工大学《编译原理》课程设计说明书3||L.code||gen(‘goto’,K.begin)||gen(S.false,‘:’)||gen(‘gotoLnext’);L-SPL.palce:=newlabel;L.code:=S.code||P.code||gen(L.palce‘:=’,S.place,P.place);P-;SP|εP.palce:=newlabel;P.code:=S.code||P.code||gen(L.palce‘:=’,‘;’,S.place,P.place)||gen(L.code‘:=ε’);S-iQES.place:=newlabel;S.code:=i.code||Q.code||E.code||gen(S.place‘:=’,i.place,Q.place,E.place);E-TGE.palce:=newlabel;E.code:=T.code||G.code||gen(E.palce‘:=’,T.place,G.place);G-+TG|-TG|εG.place:=newlabel;G.code:=T.code||G.code||gen(G.place‘:=+’,T.place,G.place)||gen(G.place‘:=-’,T.place,G.place)||gen(G.code‘:=ε’);T-FRT.palce:=newlabel;T.code:=F.code||R.code||gen(T.palce‘:=’,F.place,F.place);R-*FR|/FR|εR.place:=newlabel;R.code:=F.code||R.code||gen(R.place‘:=*’,F.place,R.place)||gen(R.place‘:=/’,F.place,R.place)||gen(R.code‘:=ε’);F-(E)|iF.place:=newlabel;F.code:=E.code||i.code||gen(F.place‘:=’,‘(’,E.place,‘)’)||gen(F.palce‘:=’,i.place);Q-=||Q.place:=newlabel;Q.code:=gen(‘=’)||gen(‘’)||gen(‘’);3.语法分析方法描述及语法分析表设计3.1语法分析方法的描述确定的自顶向下分析方法,是从文法的开始符号出发,考虑如何根据当前输入符号(单词符号)唯一地确定选用哪个产生式替换相应非终结符以往下推导,或构造一棵相应的语法树。武汉理工大学《编译原理》课程设计说明书4由分析可知,能够使用自顶向下分析技术的文法正是LL(1)文法。LL(1)的含义是:第1个L表明自顶向下分析是从左到右扫描输入串,第2个L表明分析过程中将用最左推导,1表明只需向右看一个符号便可决定如何推导即选择哪个产生式(规则)进行推导。一个上下无关文法是LL(1)文法的充分必要条件是,对每个非终结符A的任意两个不同的产生式,A→α,A→β,均满足:SEKECT(A→α)∩SEKECT(A→β)=Ф,其中α、β不能同时推导出ε。当我们需要选用自顶向下分析技术时,首先必须判别所给文法是否是LL(1)文法。因而对任给文法需计算FIRST、FOLLOW、SELECT集合,进而判别文法是否为LL(1)文法。对判断确定的LL(1)文法,构造预测分析表。分析表可以用一个矩阵M(或称二维数组)表示。矩阵的元素M[A,a]中的下标A表示非终结符,a为终结符或句子括号“#”,矩阵元素M[A,a]中的内容是一条关于A的产生式,表明当用终结符A向下推导时,面临输入符号a时,所应采取的候选产生式,当元素内容无产生式时,则表明用A为左部向下推导时遇到了不该出现的符号,因此元素内容为转向出错处理的信息。3.2语法分析表的设计3.2.1各非终结符的FIRST集合:FIRST(K)={do}FIRST(L)={i}FIRST(S)={i}FIRST(P)={;,ε}FIRST(Q)={=,,}FIRST(E)={(,i}FIRST(T)={(,i}FIRST(G)={-,+,ε}FIRST(F)={(,i}FIRST(R)={*,/,ε}3.2.2各非终结符的FOLLOW集合:FOLLOW(L)={w}FOLLOW(S)={;,w,#}FOLLOW(P)={w}FOLLOW(Q)={(,i}FOLLOW(E)={),w,#}FOLLOW(T)={+,-,w}FOLLOW(G)={;,w,),#}FOLLOW(F)={*,/,),w,#}FOLLOW(R)={),w,;,+,-,#}武汉理工大学《编译原理》课程设计说明书53.2.3各产生式的SELECT集合:SELECT(K-doLwhileS)={do}SELECT(L-SP)={i}SELECT(P-;SP)={;}SELECT(P-ε)={w}SELECT(S-iQE)={i}SELECT(E-TG)={(,i}SELECT(G-+TG)={+}SELECT(G--TG)={-}SELECT(G-ε)={;,w,-,#}SELECT(T-FR)={I,(}SELECT(R-*FR)={*}SELECT(R-/FR)={/}SELECT(R-ε)={),w,+,-,;,#}SELECT(F-(E))={(}SELECT(F-i)={i}SELECT(Q-=)={=}SELECT(Q-)={}SELECT(Q-)={}由上可知有相同左部产生式的SELECT集合的交集为空,所以文法是LL(1)文法。3.3.4构造预测分析表:i=+-*/()dw;#KdLwSLSPPε;SPSiQEETGTGG+TG-TGεεεεTFRFRRεε*FR/FRεεεεFi(E)Q=注:表中用d代表do,w代表while。武汉理工大学《编译原理》课程设计说明书64.三地址表示的描述及其结构设计4.1三地址描述此课程设计要求中间代码使用三地址表示,三地址码是由下面一般形式的语句构成的序列:x:=yopz其中,xyz为名字、常数或临时变量;op代表运算符号。每个语句中只能有一个运算符。本程序中使用的三地址语句有:赋值语句x:=yopz,x:=opy,x:=y条件转移语句ifxrelopygotoL//L为带标号L的三地址语句4.2三地址结构设计对于形如:do{算术表达式1:x=y+z;算术表达式2:p=m*n;……}while(逻辑表达式:ji)翻译成如下形式:L0:L1=y+zx=L1L2=m*np=L2……Ln=jiifLngotoL0ifnotgotoLn+1Ln+1:武汉理工大学《编译原理》课程设计说明书75.编译系统的设计及算法为实现do-while语句的词法分析、语法分析和语义分析的程序设计,我们进行了如下系统设计:5.1文法存储定义字符数组VN[]、VT[]、P[][]和整型数组M[][]。VN[]存放文法中的所有非终结符,并以‘\0’结束;VT[]存放文法中的所有终结符,并以‘\0’结束;P[][]按一定的顺序存放文法产生式右部;M[][]是二维数组,存放的是预测分析表,行对应终结符A在VN[]中的位置,列对应非终结符在VT[]中的位置,数组中的非负元素相应对应文法产生式右部在P[][]中的位置,负数表示出错标志。对输入的字符序列进行处理,将输入字符序列中的空字符去掉,将处理后的字符依次存放在字符数组var[]中,并以‘\0’结束。5.2词法分析文法设计及其存储词法分析语法分析三地址表示输出开始初始化Char是什么?标识符和关键字词法分析子程序无符号数词法分析子程序运算符词法分析子程序界限符词法分析子程序到输入流中读下一个字符=Char结束字母数字运算符界限符运算符’#’武汉理工大学《编译原理》课程设计说明书8voidlexical(){for(i=0;var[i]!='#';i++){ch=var[i];if(ch=='d'&&var[i+1]=='o')/*若遇到字符‘d’,则判断下一个字符是否是‘o’:若是,则为关键字‘do’,用‘d’表示存放在队列中;否则,进行其他操作*/{词法分析识别,字符进入队列;}elseif(ch=='w'){对后续字符进行扫描,判断其是否是关键字‘while’序列若是,则进行词法分析识别,字符进入队列;否则,返回;}elseif(index(ch,VT)=0)//判断ch是否是界符或标识符{if(ch!=界符){词法分析识别,保存输入字符,字符进入队列;}else词法分析识别;}elseif(index(ch,VT)0)//判断是否是除标识符以外的终结符{词法分析识别,字符进入队列;}}}武汉理工大学《编译原理》课程设计说明书95.3语法分析图中符号说明如下:“#”句子括号即输入串的括号“S”文法的开始符号“X”存放当前栈顶符号的工作单元“a”存放当前输入符号a的工作单元
本文标题:DO-WHILE循环语句的翻译程序设计
链接地址:https://www.777doc.com/doc-2478137 .html