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

下载本文档

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

文档简介

1、编译原理实验报告实验名称:编写语法分析程序实验类型:上机实验指导教师:蒋勇专业班级:软件 1002班姓名:学号:20101 实验地点:东 6a319 实验成绩:_ 日期: 2012 年 05 月 20 日一、实验目的通过设计、 编写、调试一个递归下降语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查和结构分析,掌握递归下降语法分析方法。语法分析是编译过程的核心部分,它的主要功能是按照程序语言的语法规则,从由词法分析输出的源程序符号串中识别出各类语法成分,同时进行语法检查,为语义分析和代码生成作准备 .语法分析程序在分析过程中检查符号串是否为该程序的句子.若是则输出该句子的分析树,否则

2、就表示源程序存在语法错误,并报告错误的性质与位置. 二、实验设计1、test 的语法规则以及改写文法1):= first()= 2):= | := := | 3):=int id; first(int id)=int 4):=| := :=| first(| )= if 、while、for、read、write、 、(、 id、num 、 ; 、| 5):= | | | first(| | |)= if、while 、for、 read、 write、 、 (、 id、num 、 ;6):= if () else := if () ( | else )first(if_stat)=if 7)

3、:= while () first(while)=while 8):= for(;) first(for)=for 9):=write ; first(write ;)=write; 10):=read id; first(read id)=read; 11):= first( )= 12):=;|; first(;|;)=; 、 (、 id 、num 13):= id=| first(id=| )=id 、 (、 num 14):=|(|=|=|=|!=) :=( |(|=|=|=|!=)first(( |(|=|=|=|!=))=(、id 、num 15):=(+|-) 产生式: : :=

4、(+|-)| : := : :=(+|-)| first( )=(、 id 、num first((+|-)| )=+、-、follow)=、=、=、=、!=、 ;16):=(*| /) :=(*| /)| := : :=(*| /)| first( )=(、 id 、num first((*| /)| )=* 、 /、follow ( )=|=|=|=|!= 17):=()|id|num first(()|id|num )=(、 id 、num 2、程序流程图主程序:开始词法分析es=0输出词法分析成功语法分析es=0输出词法分析失败输出语法分析成功输出语法分析失败yynn结束词法分析:开始

5、打开文件读取字符字母数字,!,=/错误结束符结束空格,换行nnnnn继续读字符字母或者数字组合标识符保留字输出标识符输出保留字y组合整数输出整数读下一个字符=n+-*();,:”.输出单 (双)分界符yn读下一个字符*/y读入字符读入字符换行yn*/nn结束符ny注释不配对y关闭文件ny语法分析:开始读入一个符号es=0es=1declaration_list()es=0es=0statement_list()es=0es=2ynnnnnyyy返回ystatement_list()es=0token=return(es)tooken=iftoken=iftoken=whiletoken=for

6、token=readtoken=writetoken=token=id|num|(if_stat()while_stat()for_stat()read_stat()expression_stat()compound_state()write_stat()yynnnnnnnyyyyyyntoken=yn三、实验过程1、编写代码1)改写文法,消除二义性;2)消除左递归、提取左因子;3)求 first 集、 follow 集;4)检查是不是ll(1) 文法,若不是ll(1), 说明文法的复杂性超过自顶向下方法的分析能力5)直接根据产生式设计相应的程序2、实验结果测试序号测试代码测试结果1 int

7、a; int b; a=30; if(a10) b=a+10; 测试通过2 int a; int b,number; a=30; if(a10) b=a+10; number=b+a; 未能通过原因: test 语言无法通过形如“ int a,b; ”的语句;将这条语句改为:“int a;int b; ”则能通过;3 int a; int b; a=30; if(a10 b=a+10; 未能通过的原因:在if 语句中缺少“ )”符号;4 int int b,number; a=30; if(a10) b=a+10; number=b+a; 未能通过的原因:第一条语句后边没有“;” 。5 int

8、 a int b,number; a=30; if(a10) b=a+10; number=b+a; 未能通过的原因:第一条语句后边没有“;” 。5、 int a int b,number; a=30; if(a10) b=a+10; number=b+a; 测试未能通过:未能通过的原因:第一条语句后边没有“;” 。四、讨论与分析1、ll(1) 分析的主要问题是不能处理左递归文法且要求分析表不能有多重定义。左递归转成右递归ll(1) 分析不能处理左递归文法,但也不能像递归下降分析那样将左递归改为采用扩充bnf 表示,必须将左递归文法变成右递归文法。有多重定义时,可以提取公因子,消除二义性。2、

9、不是所有的文法都满足递归下降分析条件的文法。如: s:=as |bs s :=auu|brrs :=u|ra:=aau|b b:=abr|b u:=c r:=d 3、不能够直接解决根本性的问题。五、关键代码if(es=0&strcmp(token,;)=0)/空语句 while(strcmp(token,;)=0) fscanf(fp,%s %sn,&token,&token1); printf(%s %sn,token,token1); count+; if(es=0&strcmp(token,if)=0)/if语句 es=if_stat(); if(es=0

10、&strcmp(token,while)=0)/while语句 es=while_stat(); if(es=0&strcmp(token,for)=0)/for语句 es=for_stat(); /可在此处添加do 语句调用if(es=0&strcmp(token,do)=0)/dowhile语句 es=dowhile_stat(); if(es=0&strcmp(token,read)=0)/read语句 es=read_stat(); if(es=0&strcmp(token,write)=0) /write语句 es=write_stat();

11、if(es=0&strcmp(token,)=0)/复合语句 es=compound_stat(); if(es=0&(strcmp(token,id)=0|strcmp(token,num)=0|strcmp(token,()=0) es=expression_stat();/表达式语句 return (es); 六、实验体会语法分析就是费词法分析的结果,根据语言规则, 将一个个单词组成的各种语言的各种语法类,分析时如果发现不合法规则的符号,要不这些出错的符号及错误性质报告给程序员。通过语法分析程序, 我了解了语法分析的一般方法有自顶向下分析方法和自底向上分析方法。 两种方法都是自左向右地读入符号,先对读入的符号进行词法分析,词法分析成功后再进行语法分析。在实验中我还熟悉了first 和 follow 集的求法。 更巩固了我的程序设计能力。最深的体会是:磨刀不误砍柴工。看完实验指导书,首先不应该去编写程序,而是去设计程序, 理清了程序的流程,就能很快写出程序,而且比没有经过设计写出来的程序质量要好得多。编写语法分析程序首先要改写文法,这也是最重要的。在写程序时,首先要理清需求,即程序该有那些功能,

温馨提示

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

评论

0/150

提交评论