您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > WHILE循环语句的翻译程序设计(简单优先法,三地址输出)
目录1问题域描述..........................................32文法及属性文法的描述.........................32.1WHILE循环语句的文法................................32.2WHILE循环语句的属性文法............................43语法分析方法及中间代码形式的描述................43.1语法分析方法........................................43.2中间代码形式描述....................................64编译系统的概要设计.................................74.1词法分析............................................74.2语法制导翻译........................................85详细的算法描述.....................................85.1文法设计...........................................85.2算法描述...........................................85.3源程序代码.........................................96软件的调试过程和结果测试.........................196.1调试过程............................................196.2结果测试............................................197使用说明............................................208课设总结............................................209参考文献.............................................22武汉理工大学《编译原理》课程设计1WHILE循环语句的翻译程序设计(简单优先法、输出三地址表示)1问题域描述while循环语句的翻译程序设计(简单优先法,输出单地址表示),要求完成:(1)用C++语言正确编写程序,完成WHILE循环语句的翻译程序设计。(2)求能正确进行词法分析,语法分析,并能正确的输出预期结果。(3)根据指定的文法,判定程序的正确性。本次课程设计中要求设计一个WHILE循环语句的词法﹑语法及语义分析程序,语法分析选择简单优先法,采用语法制导翻译输出中间代码三元式。通过设计、编制、调试一个WHILE循环语句的语法及语义分析程序,加深对语法及语义分析原理的理解,实现功能。while循环语句的格式为:while(P){doA},其中A为循环体,可为一个或多个赋值语句;P为循环控制条件。while循环语句首先根据循环控制条件P进行判断,若满足条件则执行循环体A,否则执行下面的程序段;本次课程设计中系统首先要进行词法分析,即从左到右把源文件的字符序列逐个进行扫描,产生一个个的单词序列,作为语法分析的输入从而继续编译过程。该程序的语法分析读入词法分析的结果,并判断输入语句是否满足while循环语句的文法所描述的形式。通过简单优先法对语句进行分析,看是否能通过给定的输入串归约到文法的开始符号。在语法分析的同时进行语义分析,最后输出三元式的代码。2文法及属性文法的描述2.1WHILE循环语句的文法定义一个文法,文法G(S)如下:S-while(P){A};A-id=E;武汉理工大学《编译原理》课程设计2E-TE'E'-+TE'|-TE'|eT-FT'T'-*FT'|/FT'|eF-(E)|idP-Eropidrop-||=|=|!=|==2.2WHILE循环语句的属性文法3语法分析方法及中间代码形式的描述3.1语法分析方法3.1.1简单优先法简单优先分析法是按照文法符号(终结符和非终结)的优先关系确定句柄的,因此我们首先介绍任意两个文法符号之间的优先关系是怎样确定的,及如何构造优先关系表。首先定义优先关系的表示:X=Y表示X和Y的优先关系相等XY表示X的优先性比Y的优先性大XY表示X的优先性比Y的优先性小这样我们就可对已知文法中的任意两个文法符号X,Y按其在举行中可能会出现的相产生式语义规则S→whileP{A}S.addr:=newlabel;E.true:=newlabel;E.false:=S.next;S1.next:=S.begin;S.code:=gen(S.begin’:’‖E。code‖gen(E.true’:’)‖S1.code‖gen(‘goto’S.begin)武汉理工大学《编译原理》课程设计3邻关系确定他们的优先关系。3.1.2简单优先法的缺点对文法的要求高,而且也要把文法符号的关系首先表示出来,这普遍性不是太好。{/**SwhileEdo{B}a=+1;(bc)#**//*S*/{N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,1},/*w/{N,N,0,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N},/*h*/{N,N,N,0,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N},/*i/{N,N,N,N,0,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,-1,N,N},/*l/{N,N,N,N,N,0,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N},/*e*/{N,N,N,N,N,N,0,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N},/*E*/{N,N,N,N,N,N,N,0,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N},/*d*/{N,N,N,N,N,N,N,N,0,N,N,N,N,N,N,N,N,N,N,N,N,N,N},/*o*/{N,N,N,N,N,N,N,N,N,0,N,N,N,N,N,N,N,N,N,N,N,N,N},/*{{N,N,N,N,N,N,N,N,N,N,0,N,N,N,N,N,N,N,N,N,N,N,N},/*A/{N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,0,N,N,N,N},/*}*/{N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,0,N},/*a*/{N,N,N,N,N,N,N,N,N,N,N,N,N,N,0,N,N,0,N,N,N,N,N},/*=*/{N,N,N,N,N,N,N,N,N,N,N,N,0,N,N,N,N,N,N,N,N,N,N},/*+*/{N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,0,N,N,N,N,N,N,N},/*1*/{N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,0,N,N,N,N,N,N},/*;*/{N,N,N,N,N,1,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N},/**/{N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,0,N,N,N},/*(*/{N,N,N,N,N,N,N,N,N,N,N,0,-1,N,N,N,N,N,N,N,N,N,N},武汉理工大学《编译原理》课程设计4/*b*/{N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,1,N},/*c*/{N,N,N,N,N,N,N,N,N,N,N,N,N,0,N,N,N,N,N,N,N,N,N},/*)*/{N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,1},/*#*/{-1,-1,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,0}};其中N表示的是没有优先关系,-1表示优先级小于,0表示优先级相同,1表示优先级大于3.2中间代码形式描述3.2.1三元式三元式是一种普遍采用的中间代码形式。它由三个部分组成:算符op,第一和第二运算对象ARG1和ARG2。运算对象有时候指用户自己定义的变量。3.2.2赋值语句的四元式对c=a+1翻译结果如下1)(+,a,1)2),(=,c,(1))3.2.3while(ab)语句翻译为方便和直观,将while语句翻译为ifabgotodo.addr4编译系统的概要设计本程序开始,需先对输入字符串进行词法分析,将其识别为一个个独立的单词序列,得到的字符单词要和关键字比较,看是否是关键字,根据比较结果进行返回相应的单词类型。单词类型主要包括标识符,关键字,常量,运算符和分界符。在语法分析程序中,根据词法分析得到的结果,进行判断是否是当前需要的单词类型,如果不是就说明输入字符串不能由该文法推导出来;如果是当前需要的类型,就相应得做该单词类型分支程序。根据简单优先法分析的字符串,看是否能得到接受状态。此外,在进行语法分析的同时进行语义分析,审查程序有无语义错误,每个算符是否具有语言规范允许的运算对象,当不符合语言规范时,编译程序应报告错误。在进行了上述的语法分析和语义分析阶段的工作之后,将源文件变成三元式表示。源程序目录下建立“input.txt”文本文档,在文档中输入while(P){A}格式的WHILE武汉理工大学《编译原理》课程设计5语句,再通过调用程序中的get_word(stringword)函数进行对文本文档中语句的读取操作。4.1词法分析词法分析是编译的第一阶段,它的主要任务是从左至右逐个字符地对源程序进行扫描,产生一个单词序列,用于语法分析。编程中,建立操作数栈和运算符栈,设定运算符优先级。对于读取的字符进行判定,若是运算符,就与栈顶符号比较优先级,高则入栈,否则栈内运算符出栈;若是非运算符,则送入操作数栈。4.2语法制导翻译在语法分析过程中,随着分析的步步进展,根据每个产生式所对应的语义子程序(或语义规则描述的语义动作)进行翻译。属性文法的每个符号有属性,所以每个符号入栈时,必须连属性一起入栈,这样,栈符号就由文法符号及存放该符号属性的域所组成。由于属性类型不同,属性域存放的内容就要根据属性的类型来定。有的可能直接存放属性值,也有的存放的是指向属性值的指针。对于综合属性,其属性域不存放其属性值,而是存放一个指针,指向存贮该属性值的单元。对于继承属性,其属性域直接保存其属性值。继承属性的属性域刚入栈时为空,但是在该栈符号变成栈顶符号之前的某一时刻,它们必须接受相应的属性值,即在成为栈顶时,继承属性的属性域必须有值。5详细的算法描述5.1文法设计为顺利完成本次课程设计,实现要求的功能,设计测试文法G(S)如下:S-while(P){A};A-id=E;E-TE'E'-+TE'|-TE'|eT-FT'T'-*FT'|/FT'|eF-(E)|idP-Eropid武汉理工大学《编译原理》课程设计6rop-||=|=|!=|==5.2算法描述(1)word_node*word_link(word_node,word_node,string)//给结点赋值,并设置type值。(2)voidget_word(stringword)函数设计:从文本文档中读取字符,存入word_array(3)简单优先子程序如下:voidrop(word_node*&p)//rop-||=|=|!=|==voidF(word_node*&p)//F-(E)|idvoidextend_T(word_node*&p)//T'-*FT'|/FT'|evoidT(word_n
本文标题:WHILE循环语句的翻译程序设计(简单优先法,三地址输出)
链接地址:https://www.777doc.com/doc-4237823 .html