编译原理-实验报告2n.doc_第1页
编译原理-实验报告2n.doc_第2页
编译原理-实验报告2n.doc_第3页
编译原理-实验报告2n.doc_第4页
全文预览已结束

下载本文档

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

文档简介

大学计算机科学与技术学院实验报告 计算机基础实验教学中心编制 成绩 指导教师(签字) (存档) 实验课程名称:编译原理课程设计 实 验 项 目:递规下降法语法分析程序开发 实 验 仪 器:机房计算机 实 验 要 求:1、 理解递归下降语法分析方法的主要原理2、 理解递归下降分析法对文法的要求3、 掌握Predict集合的求法4、 完成递归下降法的语法分析程序 实验步骤、分析设计与结果:一、实验步骤:1求SNL文法中每个产生式Predict集合Predict(A)= First() , 当eFirst()= (First()- e) Follow(A), 当eFirst()根据Predict集合的定义求SNL的文法中每个产生式的Predict集合,判断是否满足递归下降法分析条件,若不满足用消除左递归和消除公共前缀等文法等价变化算法对文法进行变换,使其满足递归下降法的要求。 对此,实验课本已经求解完全所有的SNL文法的Predict集。参照P61页。2. 构造递归下降语法分析程序(1)首先,定义了语法数的节点结构,这里只列出了与语法分析有关的部分,和语义分析相关的部分,等到语义分析时再进行补充。typedef struct treeNode struct treeNode * child3; /* 子节点指针,这里只需要3个即可*/ struct treeNode * sibling;/* 兄弟节点指针*/ int lineno;/* 源代码行号*/ NodeKind nodekind; /* 节点类型*/ union DecKind dec; StmtKind stmt; ExpKind exp; kind; /* 具体类型 ,定义为联合体,具体分析 */ int idnum; /* 相同类型的变量个数,因为可能会有多个个 */ char name1010; /* 标识符的名称 */TreeNode;(2)这里采用了递归子程序方法进行语法分析,对文法中的每个非终极符号按其产生式结构产生相应的语法分析子程序,完成相应的识别任务。其中终结符产生匹配命令,非终结符则产生调用命令。每次进入子程序之前都预先读入一个单词。因为使用了递归下降方法,所以程序结构和层次清晰明了,易于手工实现,且时空效率较高。实际的语法分析工作,从调用总程序的分析子程序开始,根据产生式进行递归调用各个分析子程序。这里我们以 := PROGRAM ProgramName为例,产生式左边即可写为函数名,该产生式的Predict集为PROGRAM,所以,函数可以写为TreeNode * programHead(void) TreeNode * t = newPheadNode();match(PROGRAM); if(t!=NULL)&(token.Lex=ID) t-lineno = 0;strcpy(t-name0, token.Sem); match(ID);/ ProgramName 的预测符只是ID,所以直接写了 return t;/这里的报错部分写在match函数中3、分工部分首先,大家先对课本的递归下降法的部分进行复习,集体进行讨论,研读附带的代码,之后进行分工编写,完成后进行整合调试。丁主要完成程序的可视化和图形文件接口方面的工作,最后将各个函数整合调试。张主要对完成的程序修改bug,添加错误处理部分,最后编写报告。樊主要研读和完成大量的递归处理函数。二、 实验结果这里重点说明一下我们小组对错误的处理情况。因为采用了递归下降法进行语法分析,所以在编程的过程中要更注意各个层次之间的调用关系,当出现错误时,如何确定错误的类型和错误的继续向下传播成了重点需要解决的问题。经过小组探讨,我们最后采用了分解整体的方法。将整个程序代码分为三个部分:程序头programhead,程序声明delcarePart,程序体programbody。在每个部分若出现错误,便进行报错,并输出相应的提示信息。为了防止错误的继续传播,我们只对这三个部分的头一个错误进行报错,之后便跳出该部分(主要通过之前定义的一个全局变量进行记录信息),通过搜索下个部分的predict集的字符,进行下一部分的语法分析。这样最多只会出现三个错误(其实这样虽然错误的提示信息少了,但是效率也提高了,因为对之后的语句并不进行语法的分析),相对来说也较符合编程者的习惯,即一般只关心第一个出现的错误。(1) 正确的展示结果:图中可以看到,在控制信息模块里,能够正确的输出语法树的信息。(2)只是出现一个错误当我们将程序头部分去掉st,导致不完整时,则会出现提示语法错误信息一条。(3)出现多个错误之后我们在声明部分添加两个错误,程序体部分也添加两个错误,发现,错误信息只是提示这个两个部分第一次出错的信息,达到了预期的效果。三、 心得体会:(1) 通过复习以前的课程和研读代码,自己亲自编写,更深入了解了语法分析,特别是递归下降法方面的工作。(2) 开始使用了过多的文件流,导致最后的读写文件总是发生错误,最后合成两个进行全局处理。(3) 因为包含了很多的递归调用的函数,在调试的过程中,需要十分小心,注意当前的状态,熟练使用F10,F11,shift

温馨提示

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

评论

0/150

提交评论