编译IF-ELSE条件语句的翻译程序设计(简单优先法、输出三地址表示)代码+报告.doc_第1页
编译IF-ELSE条件语句的翻译程序设计(简单优先法、输出三地址表示)代码+报告.doc_第2页
编译IF-ELSE条件语句的翻译程序设计(简单优先法、输出三地址表示)代码+报告.doc_第3页
编译IF-ELSE条件语句的翻译程序设计(简单优先法、输出三地址表示)代码+报告.doc_第4页
编译IF-ELSE条件语句的翻译程序设计(简单优先法、输出三地址表示)代码+报告.doc_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

武汉理工大学编译原理课程设计学 号: 0120910340205编译课程设计题 目IF-ELSE条件语句的翻译程序设计(简单优先法、输出三地址表示)学 院计算机科学与技术学院专 业计算机科学与技术专业班 级计算机科学与技术0902班姓 名指导教师郭羽成2012年1月5日课程设计任务书学生姓名: 专业班级: 计算机0902班 指导教师: 郭羽成 工作单位:计算机科学与技术学院 题目: IF-ELSE条件语句的翻译程序设计(简单优先法、输出三地址表示)初始条件:理论:学完编译课程,掌握一种计算机高级语言的使用。实践:计算机实验室提供计算机及软件环境。如果自己有计算机可以在其上进行设计。要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)(1) 写出符合给定的语法分析方法的文法及属性文法。(2) 完成题目要求的中间代码三地址表示的描述。(3) 写出给定的语法分析方法的思想,完成语法分析和语义分析程序设计。(4) 编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。(5) 设计报告格式按附件要求书写。课程设计报告书正文的内容应包括:1 系统描述(问题域描述);2 文法及属性文法的描述;3 语法分析方法描述及语法分析表设计;4 按给定的题目给出中间代码形式的描述及中间代码序列的结构设计;5 编译系统的概要设计;6 详细的算法描述(流程图或伪代码);7 软件的测试方法和测试结果;8 研制报告(研制过程,本设计的评价、特点、不足、收获与体会等);9 参考文献(按公开发表的规范书写)。时间安排:设计安排一周:周1、周2:完成系统分析及设计。周3、周4:完成程序调试及测试。周5:撰写课程设计报告。设计验收安排:设计周的星期五第1节课开始到实验室进行上机验收。设计报告书收取时间:设计周的次周星期一上午10点。指导教师签名: 2011年 11月 18日系主任(或责任教师)签名: 2011年 11月 18日一. 系统描述IF-ELSE条件语句的翻译程序设计(简单优先法、输出三地址表示)对条件语句: IF 布尔表达式 THEN 赋值语句 ELSE 赋值语句(1) 写出符合语法分析方法要求的文法和属性文法描述。(2) 给出语法分析方法的思想及分析表设计。(3) 给出中间代码序列的结构设计。(4) 完成相应的词法分析、语法分析和语义分析程序设计。(5) 编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。二文法及属性文法的描述if then else文法的产生式为:Sif E then B else BEid1 A id2 | id1A | =Bid1=num根据条件语句: IF 布尔表达式 THEN 赋值语句 ELSE 赋值语句,描述相应的文法,其中共有4个非终结符(S,E,A,B),终结符10个(if,then,else,id1,id2,=,=,num)。E为布尔表达式,B为赋值语句。 三语法分析方法描述及语法分析表设计 首先根据已知优先文法构造相应的优先关系矩阵,并将文法的产生式保存,设置符号栈S,算法步骤如下:1) 将输入符号串a1a2an#依次逐个存入符号栈S中,直到遇到栈顶符号ai的优先性下一个待输入符号aj时为止。2) 栈顶当前符号ai为句柄尾,由此向左在栈中找句柄的头符号ak,即找到 ak-1y then a=2 else u=9 的分析过程步骤符号栈优先关系移近或归约输入串1#y then a=2 else u=9#2#ify then a=2 else u=9#3#if xy then a=2 else u=9#4#if xy归约then a=2 else u=9#6#if E=移近then a=2 else u=9#7#if E then 归约else u=9#11#if E then B=移近else u=9#12#if E then B else归约#16#if E then B else B归约#17#S分析成功#四.中间代码形式的描述及中间代码序列的结构设计4.1中间代码形式描述 此设计要求使用的是三地址的中间代码,三地址代码是由下面一般形式构成的语句序列: x:=y op z;其中x,y,z为名字,常数或编译时产生的临时变量;op代表运算符号如标点,浮点运算符号等等。每个语句的右边只能有一个运算符。表达式x + y * z翻译成的三地址语句序列是:t1 := y * z t2 := x + t1常用的三地址语句有:赋值语句x := y op z, x := op y, x := y无条件转移goto L条件转移if x relop y goto L过程调用param x 和call p , n过程返回 return y索引赋值x := yi和 xi := y地址和指针赋值x := &y,x := *y和*x := y4.2中间代码序列的结构设计在本程序的文法中,中间代码的三地址码为:L1:if id1 A id2 goto L2 goto L3L2:id1=num goto LnextL3:id1=num goto LnextLnext:其中id1,id2在具体的程序运行中用输入的单词符号所确定,A代表,=三种符号,num代表数字。五. 编译系统的概要设计 在词法分析部分,应用函数word()来识别标识符和关键字,其中用ASCII码来识别字母,如遇到不合法的字符就会报错。在语法分析部分,用简单优先法完成此次文法分析的关键在于构造该文法的简单优先关系矩阵,以及如何运用该矩阵完成移入和归约的过程,从而完成整个文法的分析。求非终结符号的FIRST集和LAST集,利用FIRST集和LAST集求出优先关系,最终构造出简单优先关系矩阵。在整个简单优先关系矩阵构造成功后,我们还应该构造一个堆栈,用来存放符号;并将符号栈中的栈顶元素与输入串队列的队头元素进行比较,然后查找简单优先关系矩阵得到相应的优先关系,从而完成分析表中所要求完成的动作,如果栈中的栈顶元素比输入串队列的队头元素优先关系为则要将栈中的符号进行归约,这时要找到栈中的句柄归约,若找不到句柄进行归约则输入的符号串不是该文法的句子。找到句柄归约完之后再重复上面的步骤,最后符号栈中最后只剩该文法的开始符号,则整个过程分析成功,否则则分析失败或出现错误。根据栈的归约操作通过cout语句将三地址输出。6 源代码#define N 100#include#include#includeusing namespace std;static char aN; /*存放输入的语句*/static char strN; /*存放构成单词符号的字符串*/static int bN;static char copyyNN;static char ch;static int i=0;static int j=0;static int m;static int n;int p;int h1414;int l1414;struct list /定义结点int data;list *next;class stack/定义栈类private:list *ptr;public:stack() ptr=NULL;void push(int i);int pop();void stack:push(int x) list *q=new list;q-data=x;q-next=ptr;ptr=q;int stack: pop()list *p;int value;value=ptr-data;p=ptr;ptr=ptr-next;delete p;return value;/*词法分析程序*int word() if(ai=65&ai=97&ai=65&ai=97&ai=48&ai=48&ai=48&ai=57)&iN)ch=ai;strj=ch;i+;j+;if(ai!= )i-;return(8);else if(ai=)ch=ai;strj=ch;i+;j+;if(ai=)ch=ai;strj=ch;return(12);else i-;return(11);else if(ai=!)ch=ai;strj=ch;i+;j+;if(ai=)ch=ai;strj=ch;return(13);else i-;return(-1);else if(ai=)ch=ai;strj=ch;i+;j+;if(ai=)ch=ai;strj=ch;return(15);else i-;return(14);else if(ai=()ch=ai;strj=ch;return(17);else if(ai=)ch=ai;strj=ch;return(18);else if(ai= )return(16);elsereturn (-1);int bn() int k=0;while(kstrlen(a)bn=word();if(bn=16) i+;k=i;n-;else if(bn!=-1) i+;k=i;strcpy(copyyn,str);coutstrbn ;elsecoutendl;couterror!词法分析器分析到第n+1个单词符号这里发现错误!endl;return (-1);break;n+; for(m=0;mN;m+)strm=0;j=0;stack A,B;void inserth(int i,int j)if(!hij)hij=1;A.push(hij);void insertl(int i,int j)if(!lij)lij=1;B.push(lij);int sentence_judge()if(b0=2)if(b1=1)if(b2=3)if(b3=1)if(b4=14)if(b5=8)if(b6=4)if(b7=1)if(b8=14)if(b9=8)return (1);else return (-1);else return (-1);else return (-1);else return (-1);else return (-1);else return (-1);else return (-1);else if(b2=9)|(b2=11)|(b2=15)if(b3=1)if(b4=3)if(b5=1)if(b6=14)if(b7=8)if(b8=4)if(b9=1)if(b10=14)if(b11=8) return (2);else return (-1);else return (-1);else return (-1);else return (-1);else return (-1);else return (-1);else return (-1);else return (-1);else return (-1);else return (-1);else return(-1);else return(-1);void sentence()char cN=Sif E then B else B,Eid1 A id2id1,A=,Bid1=num;char dN=S,E,A,B,if,then,else,id1,id2,=,=,num;/非终结符4个,终结符10个char eNN=S,if,E,then,B,else,id1,=,num,#,E,id1,A, id2,id1,#,A,=,#,B,id1,=,num,#;int fNN;int gNN;/存放关系,1代表关系,2代表关系int k,n;i=0;g15=1;g28=1;g36=1;g42=1;g47=2;g53=1;g57=2;g63=1;g67=2;g72=1;g75=3;g79=2;g710=2;g711=2;g712=1;g85=3;g98=3;g108=3;g118=3;g1113=1;g136=3;cout条件语句的文法如下:endl;for(i=0;i4;i+)coutciendl;for(j=0;j4;j+)for(i=0;i4;i+) if(strcmp(ej0,di)=0)for(k=0;k14;k+)if(strcmp(ej2,dk)=0)inserth(i,k); for(j=0;j4;j+) for(k=0;k8;k+)if(strcmp(ejk,)=0)for(i=0;i4;i+) if(strcmp(ej0,di)=0)for(m=0;m14;m+)if(strcmp(ejk+1,dm)=0)inserth(i,k+1); for(j=0;j4;j+)n=0;while(strcmp(ejn,#)!=0)n+;for(i=0;i4;i+) if(strcmp(ej0,di)=0)for(k=0;k14;k+)if(strcmp(ejn-1,dk)=0)insertl(i,k);for(j=0;j4;j+) for(k=0;k8;k+)if(strcmp(ejk,)=0)for(i=0;i4;i+) if(strcmp(ej0,di)=0)for(m=0;m14;m+)if(strcmp(ejk-1,dm)=0)insertl(i,k-1); for(j=0;j4;j+)for(i=2;i10;i+)if(strcmp(eji,)!=0&strcmp(eji+1,)!=0&strcmp(eji+1,#)for(k=0;k14;k+)if(strcmp(eji,dk)=0)fjk=1;if(sentence_judge()!=-1) /sentence_judge()进行规约cout输入的句子符合语法要求!;elsecout输入的句子不符合语法要求!;void code() if(sentence_judge()=1)coutL1: if copyy1 goto L2n;cout goto L3n;coutL2: copyy3copyy4copyy5n;cout goto Lnextnendl;coutL3: copyy7copyy8copyy9n;cout goto Lnextnendl;coutLnext:exitnendl; elseif(sentence_judge()=2)coutL1: if copyy1copyy2copyy3 goto L2n;cout goto L3nendl;coutL2: copyy5copyy6copyy7n;cout goto Lnextnendl;coutL3: copyy9copyy10copyy11n;cout goto Lnextnendl;coutLnext: n endl;int main()int value;cout请输入条件语句:endl;gets(a); /*输入一个句子*/coutendl;cout词法分析分析出的单词及其对应的编码如下:endl;value=bn();coutendlendl;if(value!=-1)sentence();coutendl;if(sentence_judge()!=-1)cout进行语义分析输出的三地址码如下:c;return 0;7. 软件的测试方法和测试结果运行结果:8. 研制报告本设计收获与体会:在本次课程设计中,通过查阅一些资料和在同学的帮助下完成。在完成了整个程序后的确有很多的收获和体会。在这次课程设计中我最大的收获就是对简单优先法的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论