1 / 19
文档名称:

语法分析实验报告(实验二).doc

格式:doc   大小:1,420KB   页数:19页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

语法分析实验报告(实验二).doc

上传人:xd3225 2020/7/16 文件大小:1.39 MB

下载得到文件列表

语法分析实验报告(实验二).doc

文档介绍

文档介绍:编译原理语法分析实验报告软工082班兰洁4实验容实验目的实验要求程序流程图主函数;scanner();irparser()函数yucu()/*语句串分析*/statement()/*语句分析函数*/expression()/*表达式分析函数*/term()/*项分析函数*/factor()/*因子分析函数*/程序代码测试用例输出结果实验心得一、实验容:编写为一上下文无关文法构造其递归下降语法分析程序,并对任给的一个输入串进行语法分析检查。程序要求能对输入串进行递归下降语法分析,能判别程序是否符合已知的语法规则,如果不符合(编译出错),则输出错误信息。二、实验目的:构造文法的语法分析程序,要求采用递归下降语法分析方法对输入的字符串进行语法分析,实现对词法分析程序所提供的单词序列的语法检查和结构分析,进一步掌握递归下降的语法分析方法。三、实验要求:利用C语言编制递归下降分析程序,并对Training语言进行语法分析。待分析的Training语言语法。用扩充的表示如下:<程序>-->function<语句串>endfunc<语句串>--><语句>{;<语句>}<语句>à<赋值语句><赋值语句>àIDà<表达式><表达式>à<项>{+<项>|-<项>}<项>à<因子>{*<因子>|/<因子>}<因子>àID|NUM|(<表达式>)备注:实验当中我对程序进行了扩展,增加了程序识别if条件判断语句,while循环语句的功能实验要求说明输入单词串以“#”结束,如果是文确的句子,则输出成功信息,打印“ess”,否则输出“error”。四、程序流程图主函数:Scanner()函数:irparser()函数yucu()/*语句串分析*/statement()/*语句分析函数*/expression()/*表达式分析函数*/term()/*项分析函数*/factor()/*因子分析函数*/五、程序代码:递归下降分析文法:<程序>-->function<语句串>endfunc<语句串>--><语句>{;<语句>}<语句>à<赋值语句>|<if条件语句>|<while循环语句><赋值语句>à<表达式><表达式>à<项>{+<项>|-<项>}<项>à<因子>{*<因子>|/<因子>}<因子>àID|NUM|(<表达式>)<if条件语句>à(<表达式>)|(ID)|(NUM)à<语句><while条件循环语句>à(<表达式>)|(ID)|(NUM)à<语句>备注:红色字体部分为我对代码实现功能的主要修改与扩展部分。/*语法分析源代码*/#include<>#include<>charprog[80],token[8];charch;intsyn,p,m=0,n,sum,kk=0;char*rwtab[6]={"function","if","then","while","do","endfunc"};voidyucu();voidexpression();voidstatement();voidfactor();voidterm();voidirparser();voidscaner(){ for(n=0;n<8;n++) token[n]=NULL; while(ch==''||ch=='\n') ch=prog[p++]; m=0; if((ch<='z'&&ch>='a')||(ch<='Z'&&ch>='A')) {while((ch<='z'&&ch>='a')||(ch<='Z'&&ch>='A')||(ch<='9'&&ch>='0')) {token[m++]=ch; ch=prog[p++]; } syn=10; for(n=0;n<6;n++) if(strcmp(token,rwtab[n])==0) { syn=n+1; break; } token[m++]='\0';} else if(ch<='9'&&ch>='0') { sum=0; while(ch<='9'&&ch>='0') { sum=sum*10+ch-'0'; ch=prog[p++]; } syn=11; } else { switch(ch) { case'<':m=0;token[m++]=ch; ch=prog[p++]; if(ch=='=') {syn=22; token[m+1]=ch;} else {syn=20;ch=prog[--p];} break; case'>':m=0;token[m++]=ch; ch=prog[p++]; if(ch=='=') { syn=24; token[m++]=ch; } else {syn=23;p--; } break; case'=':m=0;token[m++]=ch