编译原理-用递归下降法进行表达式分析实验报告_第1页
编译原理-用递归下降法进行表达式分析实验报告_第2页
编译原理-用递归下降法进行表达式分析实验报告_第3页
编译原理-用递归下降法进行表达式分析实验报告_第4页
编译原理-用递归下降法进行表达式分析实验报告_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

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

文档简介

1、编译原理课程实验报告题目用递归下降法进行表达式分析专业班级学号姓名.实验题目用递归下降法进行语法分析的方法.实验日期.实验环境(操作系统,开发语言)操作系统是Windows开发语言是C 语言四 . 实验内容(实验要求)词法分析程序和语法分析程序已经提供。 此语法分析程序能够实现:正确的 输入可以给出结果。例:输入表达式串为:( 13+4) *3 则应给出结果为 51 。要求:( 1 ) 读懂源代码,理解内容写入实验报告(语法分析及语法分析程序和词法分 析程序的接口)(2) 把语法分析中使用的 yyval ,用 yytext 实现。( 3 ) 在语法分析程序用加入出错处理(尽量完整,包括出错的位

2、置,出错的原因,错误的重定位)五.实验步骤生成 lex.yy.c 文件:将已给的 mylexer 文件打开,先理解,然后再在DOS 环境下用 flex 运行 此文件,这时会生成一个 lex.yy.c 文件。创建工程:打开 C-Free 5.0 (注:用 C-Free 4.0 会出错 ), 在菜单栏中的“工程(project )菜单下选择“新建”;在新建工程中选择“控制台程序”,添加工程名字为myleb ”和保存位置后点“确定”;第1步选择“空的程序”点“下一步”;第 2步再点“下一步”;最后点击“完成”在创建的工程中添加文件:在Source files文件夹中添加之前生成的lex.yy.c文件

3、和syn.c文件,然后找到parser.h文件,将其添加到新建工程中的Header files文件夹中,这时就能将三个文件组成一个类似于.exe文件类型的文件,最后运行。如图:Source-M叩:I& K yy. c-Header Fil? s -时 parser-h ,_| Other Files4.理解并修改syn.c文件:首先,各 num = val 修改成 num = atoi(yytext); 4各 num = yyval.fval 修改成num = atof(yytext)。可以这样修改的原因:在文件中所写的规则中,有DIGIT+ val = a

4、toi(yytext);return INTEGER; 和DIGIT+.DIGIT* yyval.fval = atof(yytext); return DOUBLE; 这两句代 码,其中 val =atoi(yytext)和yyval.fval = atof(yytext)就说明两者可 以相互替代。然后,反复修改F()函数(可将printf()带入其中调试),修改“case LPAREN : 和“default: 中的部分,使这段代码即可检测出缺少(又可检测出缺少)以 及“)(”(右括号在前)或是括号中没有数字的情况。最后,综合理解 double E();double F(

5、);void S();double T(); 四个函数以及运用“ extern VAL yyval; ”这样的语句使此代码可运用其他文件中的变量,如 TOC o 1-5 h z *yyin 、 *yytext 。另外为了更好理解,我将个别函数中的 switch 函数修改成if的选择语句六.实验体会 (包括收获、心得体会、存在的问题及解决问题的方法、建议等)这是我们第一次接触语法分析,用递归下降法来进行表达式的分析。第一次接触的确很陌生。在实验中,要想进行分析,需要在文件中写出规则,然后在 .h 文件中定义规则中的 “+ - * / () ”,将其定义为 PLUS 3 、 MINUS 4 、 T

6、IMES 5 、 SLASH 6LPAREN 7 、 RPAREN 8 , 这样一来,文件中的规则就可运用到 syn.c 文件 中去,而在用户输入的“ +-*/() ”就可传到规则中去替换成对应的字母,进行运算。此时的+ 就可用“ PLUS 表示;-就可用 MINUS ”表示;* 就 可用“ TIMES ”表示; / 就可用“ SLASH ”表示; ( 就可用“ LPAREN ” 表示; ) 就可用“ RPAREN ”表示。另外double E();double F();voidS();double T() 四个函数中,以S() 函数为起始函数依次向后调用函数,直到函数F() ,并且完成了 “

7、先算括号内,再算*/ ,最后算+- ”的运算顺序。另外,实验调试中是可以让用户输入的,但代码中没有一句scanf() 输入函数,而在 main() 函数里有“ yyin=(char*)stdin; ”这一句代码,这就是用来输入的,其含义就是将所输入的内容传到 yyin 中去这次实验让我初步了解了,自己编写的规则是可以运用在程序代码里并能运行的。其实如果不用这样的方法,我们也能编写出计算表达式的代码, 但是这样的方法去编写感觉代码要容易读懂很多,代码也显得简便了。七.实验结果(关键源代码)#i nclude#in elude parser.h exter n VAL yyval; exter n

8、 char *yyin; extern int yylex(); exter n/运用其他文件中的变量char *yytext;int toke ntype;double E();double F();void S();double T();double F()/ F - (E) | int | doubledouble num;toke ntype=yylex();switch(toke ntype)case INTEGER:num = atoi(yytext);break;case DOUBLE:num = atof(yytext);break;case LPAREN:num = E();

9、if(toke ntype!= RPAREN)printf( 表达式中缺少 )n);break;if(toke ntype!= LPAREN)printf( 表达式中缺少 (n);else break;break;default:printf(您输入的表达式有误!n);break;toke ntype = yylex();return num;double T()/ T- F*F | /Fdouble t1,t2;t1 = F();while(toke ntype = TIMES | toke ntype = SLASH) switch(toke ntype) case TIMES:t2 =

10、F(); t1 = t1 * t2; break;case SLASH:t2 = F();t1 = t1 / t2; break;default:break;return t1;double E()/ E - T+T | -Tdouble t1,t2;t1 = T();while(tokentype = PLUS | tokentype = MINUS) if (toke ntype = PLUS) t2 = T();t1 = t1 + t2;break;if (toke ntype = MINUS)t2 = T();t1 = t1 - t2;break;if(tokentype != PLUS & tokentype != MINUS) break;return t1;void

温馨提示

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

评论

0/150

提交评论