收藏 分享(赏)

编译原理 用递归下降法进行表达式分析实验报告.doc

上传人:精品资料 文档编号:10089113 上传时间:2019-10-08 格式:DOC 页数:8 大小:68.50KB
下载 相关 举报
编译原理 用递归下降法进行表达式分析实验报告.doc_第1页
第1页 / 共8页
编译原理 用递归下降法进行表达式分析实验报告.doc_第2页
第2页 / 共8页
编译原理 用递归下降法进行表达式分析实验报告.doc_第3页
第3页 / 共8页
编译原理 用递归下降法进行表达式分析实验报告.doc_第4页
第4页 / 共8页
编译原理 用递归下降法进行表达式分析实验报告.doc_第5页
第5页 / 共8页
点击查看更多>>
资源描述

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

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

3、夹中添加之前生成的 lex.yy.c 文件和 syn.c 文件,然后找到 parser.h 文件,将其添加到新建工程中的 Header files 文件夹中,这时就能将三个文件组成一个类似于.exe 文件类型的文件,最后运行。如图:4. 理解并修改 syn.c 文件:首先,将 num = yyval.intval 修改成 num = atoi(yytext);将 num = yyval.fval 修改成 num = atof(yytext)。可以这样修改的原因:在 .l 文件中所写的规则中,有DIGIT+ yyval.intval = atoi(yytext);return INTEGER;

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

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

6、l 文件中的规则就可运用到 syn.c文件中去,而在用户输入的“+-*/()”就可传到规则中去替换成对应的字母,进行运算。此时的+就可用“PLUS”表示;-就可用 “MINUS”表示;*就可用“TIMES”表示;/就可用“SLASH”表示; (就可用“LPAREN”表示; )就可用“RPAREN”表示。另外 double E();double F();void S();double T()四个函数中,以 S()函数为起始函数依次向后调用函数,直到函数 F(),并且完成了“先算括号内,再算*/,最后算 +-”的运算顺序。另外,实验调试中是可以让用户输入的,但代码中没有一句 scanf()输入函数

7、,而在 main()函数里有“yyin=(char*)stdin;”这一句代码,这就是用来输入的,其含义就是将所输入的内容传到 yyin 中去。这次实验让我初步了解了,自己编写的规则是可以运用在程序代码里并能运行的。其实如果不用这样的方法,我们也能编写出计算表达式的代码,但是这样的方法去编写感觉代码要容易读懂很多,代码也显得简便了。七.实验结果(关键源代码)#include#include “parser.h“extern VAL yyval; /运用其他文件中的变量extern char *yyin;extern int yylex();extern char *yytext;int tok

8、entype;double E();double F();void S();double T();double F() / F - (E) | int | doubledouble num;tokentype=yylex();switch(tokentype)case INTEGER:num = atoi(yytext);break;case DOUBLE:num = atof(yytext); break;case LPAREN:num = E(); if(tokentype!= RPAREN)printf(“表达式中缺少 ) n“);break; if(tokentype!= LPAREN

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

10、: break;return t1;double E() / E - T+T | -Tdouble t1,t2;t1 = T();while(tokentype = PLUS | tokentype = MINUS) if (tokentype = PLUS)t2 = T();t1 = t1 + t2;break; if (tokentype = MINUS)t2 = T();t1 = t1 - t2;break;if(tokentype != PLUS return t1;void S()double result;result = E();printf(“%.2fn“,result);int main()yyin=(char*)stdin; /输入语句,将输入的语句都传给 yyinprintf(“请输入算术表达式: n“);S(); /调用开始符号system(“PAUSE“);return 0;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报