语法分析实验报告.docx_第1页
语法分析实验报告.docx_第2页
语法分析实验报告.docx_第3页
语法分析实验报告.docx_第4页
语法分析实验报告.docx_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

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

文档简介

语法分析实验报告一、 语法分析功能与目的语法分析是编译过程的核心部分,它的主要任务是按照程序语言的语法规则,从由词法分析输出的源程序符号串中识别出各类语法成分,同时进行语法检查,为语义分析和代码生成作准备。执行语法分析任务的程序叫语法分析程序或语法分析器。语法分析程序以词法分析输出的符号串作为输入,在分析过程中检查这个符号串是否为该程序语言的句子。如是,则输出该句子的分析数,否则就表示源程序存在语法错误,需要报告错误的性质和位置。二、TEST语法规则=|=int ;:=|:=|:=if()else:=while():=for(;):=write;:=read;:=:=;|;:=|:=|(|=|=|=|!=):=(+|-):=(*|/):=()|:=dowhile();三、 实验四要求及改进思路实验要求:修改词法分析程序TESTscan.c和语法分析程序TESTparse.c这二个文件,使该程序能分析:(1) do语句(有关文法规则参见P77的习题8。)(2) 同一行中声明多个变量(文法规则参见P77的习题7)。 例如:原先可以分析的变量声明是: int a; int b; 现在能分析的变量声明是: int a, b;改进思路:对于问题(1),由于do语句的语法规则为:=dowhile();do语句的正确输入形式为:do 表达式while (表达式);所以do语句的前半部分为一个复合语句,所以在语法分析程序中要能分析出do语句,必须在定义do语句时先要求该句子属于复合语句,然后使指针为while,再到(,然后是表达式,接着就是),最后为;,这就是完整的do语句。定义do语句的代码如下:int do_stat()int es = 0;fscanf(fp,%s %sn,&token,&token1);printf(%s %sn,token,token1); es=compound_stat(); /调用复合语句if(es0) return (es);if (strcmp(token, while) return(es=8);fscanf(fp,%s %sn,&token,&token1);printf(%s %sn,token,token1); if (strcmp(token, () return(es=5);/少左括号fscanf(fp,%s %sn,&token,&token1);printf(%s %sn,token,token1); es = expression(); /调用表达式if(es0) return (es);if (strcmp(token, ) return(es=6);/少右括号fscanf(fp,%s %sn,&token,&token1);printf(%s %sn,token,token1); if (strcmp(token, ;) return(es=4);/少分号fscanf(fp,%s %sn,&token,&token1);printf(%s %sn,token,token1); return es;然后在语法分析程序的开始定义的函数中必须加上int do_stat();;然后在函数出错的情况switch (es)的函数中加上case 8: printf(do后面缺少while! n); break;,这是说明do语句不完整的出错情况。对于问题(2):同一行中定义多个变量,对比前后变化的两个变量声明形式,我们可以看出同一行中定义多个变量时,在分析第一个变量时原来的变量声明能分析得出来,但是在接下来的变量中就有变化了,在同一行定义多个变量的第二个变量是接第一个变量后的,第二个变量的为第一个变量后接着一个逗号,然后就是第二个变量,如果同一行有n多个变量,那么从第三个变量开始,就先能分析出其必须先要分析出第二个变量,以此类推,分析出第n个变量就必须分析出前n-1个变量,而且要能分析出第n(n2)个变量,其要求就如同分析出第二个变量,它就是一个反复调用的过程。我们可以定义一个函数d(),要求它的结构为逗号后接着标识符,然后就由原来的分析出单个变量的变量声明在分析到标识符的时候调用我们定义的函数d(),就能实现一行识别出多个变量了。函数d()的定义如下:int d()if(strcmp(token,)=0) int es=0;fscanf(fp,%s %sn,&token,&token1); printf(%s %sn,token,token1);if (strcmp (token, ID) return (es=3); /不是标识符fscanf(fp,%s %sn,&token,&token1); printf(%s %sn,token,token1); d();在声明语句定义时调用d()函数实现一行识别出多个变量的情况如下:/ : : = int ID; int declaration_stat()int es=0;fscanf(fp, %s %sn, &token, &token1);printf (%s %sn,token, token1);if (strcmp (token, ID) return (es=3); /不是标识符fscanf(fp,%s %sn,&token,&token1); printf(%s %sn,token,token1); d();if (strcmp(token,;) return(es=4);fscanf (fp, %s %sn, &token, &token1);printf (%s %sn,token, token1);return(es);四、 该语法分析程序是递归下降分析的语法分析方法递归下降分析的方法思路是将文法中的每一个非终结符U的文法规则看作是识别U的一个过程定义,为每个非终结符另构造一个子程序,以完成该非终结符号所对应的语法成分的分析和识别任务。如果U的文法规则的右部只有一个候选式,按从左向右的顺序依次构造规则U的识别过程代码:如果有终结符号,判断能否与输入的符号相等,如果想等,表示识别成功,读入指针指向下一个输入符号;如果不想等,则意味着输入串此时有语法错误;如果是非终结符号,则简单调用这个非终结符号的子程序,由这个子程序完成该非终结符号所对应的语法成分分析和识别任务;当一条规则右部有多个候选式时,则根据每个候选式的第一个符号确定该候选式分支;只有被调用的分析识别某语法成分的子程序匹配输入串成功,且正确返回时,该语法成分才算真正获得识别。五、输入文件内容及屏幕输出内容输入正确的源文件如下:词法分析结果内容如下:语法分析屏幕输出的内容如下:下面接着余下的输出部分:输入文件为错误的源文件如下:语法分析屏幕输出的内容如下:从语法分析结果中我们看到语法分析都for语句的后半句i+的时候就停止了,然后错误的缘由是缺少操作数,因为for语句后接着的是,而i+:形式没有符合TEST的语法规则里的任何一种语句规则,所以出现错误。当输入源程序改为如下:语法分析屏幕输出的内容如下:从语法分析输出结果我们看出当分析到do语句的最后时出错,错误为缺少分号,说明我们的源文件输入do语句有错,查看do语句的标准形式,最后面应该以分号结束,而我们输入的源文件缺少了分号,所以出现了错误。当输入源文件为如下所示时:语法分析屏幕输出如下所示:我们从语法分析结果看出,这次语法分析根本就无法开始,错误为缺少,说明我们的输入的程序开始就有错误,查看TEST语法规则,第一个规则为=,说明输入程序以开始并以结束,而反观我们的输入程序,并没有以开始,所以

温馨提示

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

评论

0/150

提交评论