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

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《编译原理》课程

实验报告

题目用递归下降法进行表达式分析

专业

班级

学号

姓名

一. 实验题目

用递归下降法进行语法分析的方法

二. 实验日期

三. 实验环境(操作系统,开发语言)

操作系统是Windows

开发语言是C语言

四. 实验内容(实验要求)

词法分析程序和语法分析程序已经提供。此语法分析程序能够实现:正确的输入可以给出结果。例:输入表达式串为:(13+4)*3则应给出结果为51。

要求:

(1)读懂源代码,理解内容写入实验报告(语法分析及语法分析程序和词法分析程序的接口)

(2)把语法分析中使用的yyval,用yytext实现。

(3)在语法分析程序用加入出错处理(尽量完整,包括出错的位置,出错的原因,错误的重定位)

五. 实验步骤

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文件夹中添加之前生成的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; }和{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();四个函数以及运用“extern VAL yyval;”这样的语句使此代码可运用其他文件中的变量,如*yyin、*yytext。另外为了更好理解,我将个别函数中的switch函数修改成if的选择语句。

六. 实验体会(包括收获、心得体会、存在的问题及解决问题的方法、建议等)

这是我们第一次接触语法分析,用递归下降法来进行表达式的分析。第一次接触的确很陌生。

在实验中,要想进行分析,需要在.l文件中写出规则,然后在.h文件中定义规则中的“+ - * / ()”,将其定义为PLUS 3 、MINUS 4、TIMES 5、 SLASH 6 LPAREN 7 、RPAREN 8,这样一来,.l文件中的规则就可运用到syn.c文件中去,而在用户输入的“+-*/()”就可传到规则中去替换成对应的字母,进行运算。此时的‘+’就可用“PLUS”表示;‘-’就可用“MINUS”表示;‘*’就可用“TIMES”表示;‘/’就可用“SLASH”表示;‘(’就可用“LPAREN”表示;‘)’就可用“RPAREN”表示。另外double E();double F();void S();double T()四个函数中,以S()函数为起始函数依次向后调用函数,直到函数F(),并且完成了“先算括号内,再算*/,最后算+-”的运算顺序。

另外,实验调试中是可以让用户输入的,但代码中没有一句scanf()输入函

数,而在main()函数里有“yyin=(char*)stdin;”这一句代码,这就是用来输入的,其含义就是将所输入的内容传到yyin中去。

这次实验让我初步了解了,自己编写的规则是可以运用在程序代码里并能运行的。其实如果不用这样的方法,我们也能编写出计算表达式的代码,但是这样的方法去编写感觉代码要容易读懂很多,代码也显得简便了。

七. 实验结果(关键源代码)

#include

#include "parser.h"

extern VAL yyval; //运用其他文件中的变量

extern char *yyin;

extern int yylex();

extern char *yytext;

int tokentype;

double E();

double F();

void S();

double T();

double F() // F -> (E) | int | double

{

double 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)

{

printf("表达式中缺少 '(' \n");

}

else break;

break;

default:

printf("您输入的表达式有误!\n");

break;

}

tokentype = yylex();

return num;

相关文档
最新文档