FOR循环语句的翻译程序设计(递归下降法、输出三表示)-编译课程设计书_第1页
FOR循环语句的翻译程序设计(递归下降法、输出三表示)-编译课程设计书_第2页
FOR循环语句的翻译程序设计(递归下降法、输出三表示)-编译课程设计书_第3页
FOR循环语句的翻译程序设计(递归下降法、输出三表示)-编译课程设计书_第4页
FOR循环语句的翻译程序设计(递归下降法、输出三表示)-编译课程设计书_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

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

文档简介

1、学 号: 课 程 设 计题 目编译原理课程设计学 院计算机科学与技术学院专 业计算机科学与技术专业班 级计算机0901班姓 名丁秀文指导教师陈天煌2012年1月7日课程设计任务书学生姓名: 丁秀文 专业班级: 计算机0901班 指导教师: 陈天煌 工作单位:计算机科学与技术学院 题目: FOR循环语句的翻译程序设计(递归下降法、输出三地址表示)初始条件:理论:学完编译课程,掌握一种计算机高级语言的使用。实践:计算机实验室提供计算机及软件环境。如果自己有计算机可以在其上进行设计。要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)(1) 写出符合给定的语法分析方法的

2、文法及属性文法。(2) 完成题目要求的中间代码三地址表示的描述。(3) 写出给定的语法分析方法的思想,完成语法分析和语义分析程序设计。(4) 编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。(5) 设计报告格式按附件要求书写。课程设计报告书正文的内容应包括:1 系统描述(问题域描述);2 文法及属性文法的描述;3 语法分析方法描述及语法分析表设计;4 按给定的题目给出中间代码形式的描述及中间代码序列的结构设计;5 编译系统的概要设计;6 详细的算法描述(流程图或伪代码);7 软件的测试方法和测试结果;8 研制报告(研制过程,本设计的评价、特点、不足、收获与体会等);9 参考文献

3、(按公开发表的规范书写)。时间安排:设计安排一周:周1、周2:完成系统分析及设计。周3、周4:完成程序调试及测试。周5:撰写课程设计报告。设计验收安排:设计周的星期五第1节课开始到实验室进行上机验收。设计报告书收取时间:设计周的次周星期一上午10点。指导教师签名: 2011年 11月 18日系主任(或责任教师)签名: 2011年 11月 18日1、系统描述(问题域描述)1.1、目的通过设计、编制、调试一个FOR循环语句的语法及语义分析程序,加深对语法及语义分析原理的理解,实现词法分析程序对单词序列的词法检查和分析,并且实现对单词序列的语法分析、语义分析以及中间代码生成。1.2、设计内容写出符合

4、给定的语法分析方法的文法及属性文法。完成题目要求的中间代码三地址表示的描述。写出给定的语法分析方法的思想,完成语法分析和语义分析程序设计。编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。设计报告格式按附件要求书写。2、文法及属性文法的描述S->FOR 语句1 DO 语句2语句1->语句2 语句3 语句4语句2->表达式1 语句3->标识符 i语句4->标识符 jS ->for S1 do S2S1 ->S2ABS2 ->i=jA ->stepjB ->untilj3、 语法分析方法描述及语法分析表设计递归下降法又称递归

5、子程序法。在程序语言的语法定义中有许多采用递归定义。我们在对它进行语法分析时,编制的处理程序也采取递归的方式,可使其结构简单易读。但由于频繁地调用子程序大大地降低了分析速度。2.1、递归下降法的主要思想:对每个非终结符按其产生式结构写出相应语法分析子程序。因为文法递归相应子程序也递归,子程序的结构与产生式结构几乎一致。所以称此种方法称为递归子程序法或递归下降法。2.2、用程序表示递归子程序的内部结构: 设A是一个非终结符: A1 A2 An 则写(A) Û if charfirst(1 ) then(1 ) else if charfirst(2 ) then (2 ) else i

6、f charfirst(n ) then (n) else ERROR其中(i)表示调用处理符号串i的子程序。1、任一非终结符B都不是左递归的,否则会产生死循环。2、对A的任意两个右部i , j ,有:first(i)first(j)= 。First(i)表示i所能导出串的第一个符号的集合。显然,每个i的first(i)是互不相同的,否则则无法判断应执行哪个(i )。 4、按给定的题目给出中间代码形式的描述及中间代码序列的结构设计一般形式:x := y op z 如表达式x + y * z 翻译成的三地址代码序列是: t1 := y * z t2 := x + t1 常用的三地址表示:赋值语句

7、 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 := y三元式结构形式: 编号 (OP,ARG1,ARG2)在本次课设中,以for i=1 step 1 until 10 do a=1#为例输出的三地址代码是:100 i=1101 goto 103102 i:=i+1103 if i<0 goto 105104 goto 1

8、07105 a:=1106 goto 102107 end我的中间代码结构是这样设计的:第1条语句 输出表达式1第2条语句 跳转到条件判断语句第3条语句 输出表达式2第4条语句 条件判断语句第5条语句 跳转到结束第6条语句 输出赋值表达式第7条语句 跳转到第3条语句5、 编译系统的概要设计5.1 问题分析在该阶段严格按照设计指导书,分析要完成什么功能。词法分析提取单词,写出正确的文法,语法分析检查输入单词串是否符合文法,语义分析完成中间代码的输出,使用LL(1)法语法分析。5.2 递归下降分析法递归下降分析技术就是通过对每个非终结符编写一个子程序来实现它的操作,然后通过递归的调用来实现对输入字

9、符串的分析,这其中还包括对输入字符串的词法分析。在词法分析的时,得到的字符单词要和关键字比较,看是否是关键字,根据比较结果进行返回相应的单词类型。单词类型主要包括界限符,关键字,常量,标识符,运算符等,每种符号都是一种类型。在语法分析程序中,根据词法得到的结果,进行判断是否是当前需要的单词类型,如果不是就说明输入字符串不能由该文法推导出来;如果是当前需要的类型,就相应得做该单词类型分支程序。根据文法可以得到这个递归下降程序可以分析for语句,在文法的开始符号S开始进行递归调用,因此这个文法的递归中就要考虑到调用以及递归。在递归子程序中,在嵌套调用其他子程序时都是有一定条件的,当满足这个条件的时

10、候该程序可以按照满足的条件执行下去,当没有满足程序中的条件时就会显示语法错误6、 详细的算法描述void main()/主函数Ofstream out(“”)/定义分析结果输出文件cout<<"*产生式*"<<endl;/ for step until do i j = cout<<" S ->for S1 do S2"<<endl; / 编号 2 3 4 5 6 7 8 cout<<" S1 ->S2AB"<<endl; cout<<&q

11、uot; S2 ->i=j"<<endl; cout<<" A ->stepj"<<endl; cout<<" B ->untilj"<<endl;turn=0; num=buffer()-1; int x=0;/计识别的单词的个数for(;turn<=num;turn+)/总循环,ch存放刚读入的字符,strtoken存放已识别的标志付或保留字,turn是数组str的下标if(IsLetter(ch)/判断是否是字母/存放到strtokenfor(int i=

12、0;i<n;i+) recordx->wordi=strTokeni; cout<<recordx->wordi;/输出识别的标志符或保留字 cout<<","<<kind<<")"<<endl; recordx->wordi='0' clear(); x+;词法分析/*语法分析*/打印单词的编号/制导翻译/if(!S(ana,j) cout<<"语法出错!"<<endl; else cout<<&q

13、uot;三地址码如下:"<<endl; out<<"三地址码如下:"<<endl; cout<<"100 " out<<"100 " int i=0; while(record1->wordi!='0')cout<<record1->wordi+;out<<record1->wordi-1;cout<<record2->word0;out<<record2->word0;

14、i=0; while(record3->wordi!='0') cout<<record3->wordi+;cout<<endl; cout<<"101 goto 103"<<endl; /词法分析/int buffer()/载入单词while(ch!=#) str/i+=ch; fin.get(ch); stri='0'/输入程序,以“#”作为结束标志bool IsLetter(char ch)/判断是否是字母bool IsDigit(char ch)/判断是否是数字char Ge

15、tChar(int i)/读取字符char GetBC(char ch)/判断是不是空格或者换行,如果是,直接读取下一个字符直道不再空白为止int Reserve()/以单词为单位查找保留字,是则返回编码,不是则返回0,用来区分标志符和保留字/*语法递归分析*/int A(int * c,int & q)if(cq+=3) if(cq=7) q+;return 1; else cout<<"step右部出错"<<endl;return 0; else cout<<"error 'step'"&l

16、t;<endl;return 0;int B(int * b,int & o) if(bo+=4) if(bo=7) o+; return 1; else cout<<"until右部出错"<<endl;return 0; else cout<<"error 'until'"<<endl;return 0;int S2(int * d,int & h) if(dh+=6) if(dh+=8) if(dh=6|dh=7) h+; return 1; else cout&l

17、t;<"赋值语句右部出错 "<<endl;return 0; else cout<<"赋值语句缺少赋值运算符 "<<endl;return 0; else cout<<"赋值语句左部出错 "<<endl;return 0;int S1(int * m,int & n) if(S2(m,n) if(A(m,n) if(B(m,n) return 1; else return 0; else return 0; else return 0; int S(int *a

18、,int & z) if (az+=2) if (S1(a,z) if(az+=5) if(S2(a,z) cout<<"succeed!"<<endl;return 1; else return 0; else cout<<"error 'do'"<<endl; return 0; else return 0; else cout<<"error 'for'"<<endl; return 0;7、软件的测试方法和测试结果针

19、对所设计的关于 for循环语句的翻译程序,分别用正确的程序和有错误的程序进行测试,测试出结果程序的可用性和健壮性。测试中分别使用了合法程序和非法程序,对结果程序进行测试,具体的测试程序、测试过程和测试结果如下: 正确的测试输入文件执行结果输出文件错误的测试输入文件执行结果8、 研制报告在课程设计期间,通过不断地阅读书籍资料,上网搜查各种实例,根据相关的知识,参考一些经典的例子,写出较为简单的FOR循环语句的翻译程序设计(递归下降法、输出三地址表示)先设计简单的语法规则的属性文法,画出流程图,对程序进行概要设计,要想实现此算法,主要分成词法分析和语法分析。词法分析从文本中逐个读出各个单词,并对单词进行识别和分类,并且保存单词个信息。语法分析负责对输入流中的单词进行分析,检验是否符合所写的语法规则,并对其进行初步翻译。利用流程图,设计出大致的流程,对词法分析和语法分析进行详细的设计,对主函数进

温馨提示

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

评论

0/150

提交评论