编译原理用递归下降法进行表达式分析实验报告
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
.
.
因,错误的重定位)
五 . 实验步骤 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. 在创建的工程中添加文件:
然后,反复修改 F() 函数(可将 printf() 带入其中调试),修改“case LPARE:N”
和“ default: ”中的部分, 使这段代码即可检测出缺少 ‘(’又可检测出缺少ຫໍສະໝຸດ Baidu‘)’
.
.
以及“)(”(右括号在前)或是括号中没有数字的情况。
最后,综合理解 double E();double F();void S();double T();
INTEGER;}
和 {DIGIT}+"."{DIGIT}* {yyval.fval = atof(yytext); return DOUBLE; }
这
两句代码,其中 yyval.intval = atoi(yytext)
和 yyval.fval = atof(yytext)
就说明两者可以相互替代。
.
《编译原理》课程 实验报告
题目 用递归下降法进行表达式分析
专业 班级 学号 一 . 实验题目姓名
用递归下降法进行语法分析的方法 二 . 实验日期 三 . 实验环境(操作系统,开发语言)
操作系统是 Windows 开发语言是 C 语言
四 . 实验内容(实验要求) 词法分析程序和语法分析程序已经提供。 此语法分析程序能够实现: 正确的
四个函数
以及运用“ extern VAL yyval; ”这样的语句使此代码可运用其他文件中的变量,
如 *yyin 、*yytext 。另外为了更好理解,我将个别函数中的 switch 函数修改成
if 的选择语句。
六 . 实验体会( 包括收获、心得体会、存在的问题及解决问题的方法、建议等
)
这是我们第一次接触语法分析, 用递归下降法来进行表达式的分析。 第一次
在 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
// 运用其他文件中的变量
int tokentype;
double E(); double F(); void S(); double T();
double F() // F -> (E) | int | double {
double num; tokentype=yylex(); switch(tokentype) { case INTEGER:
接触的确很陌生。
在实验中,要想进行分析,需要在 .l 文件中写出规则,然后在 .h 文件中定
义规则中的“ + - * / ( )”,将其定义为 PLUS3 、 MINUS4、TIMES5、 SLASH
6 LPAREN 7 、 RPAREN,8 这样一来, .l 文件中的规则就可运用到 syn.c 文件中
输入可以给出结果。例:输入表达式串为: (13+4)*3 则应给出结果为 51。 要求: ( 1)读懂源代码,理解内容写入实验报告(语法分析及语法分析程序和词法分 析程序的接口) ( 2)把语法分析中使用的 yyval ,用 yytext 实现。 ( 3)在语法分析程序用加入出错处理(尽量完整,包括出错的位置,出错的原
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;
去,而在用户输入的 “+-*/() ”就可传到规则中去替换成对应的字母, 进行运算。
此时的‘+’就可用“PLUS”表示;‘- ’就可用“MINUS”表示;‘* ’就可用“ TIMES”
表示;‘/ ’就可用“ SLASH”表示; ‘ ( ’就可用“ LPARE”N 表示; ‘) ’就可
用“ RPARE”N表示。另外 double E();double F();void S();double T()
四个
函数中,以 S() 函数为起始函数依次向后调用函数,直到函数 F() ,并且完成了
“先算括号内,再算 */ ,最后算 +- ”的运算顺序。
另外,实验调试中是可以让用户输入的,但代码中没有一句 scanf() 输入函
数,而在 main() 函数里有“ yyin=(char*)stdin; ”这一句代码,这就是用来输
入的,其含义就是将所输入的内容传到 yyin 中去。
这次实验让我初步了解了, 自己编写的规则是可以运用在程序代码里并能运
行的。其实如果不用这样的方法, 我们也能编写出计算表达式的代码, 但是这样
的方法去编写感觉代码要容易读懂很多,代码也显得简便了。
.
.
七 . 实验结果(关键源代码)
#include<stdio.h> #include "parser.h" extern VAL yyval; extern char *yyin; extern int yylex(); extern char *yytext;
.
因,错误的重定位)
五 . 实验步骤 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. 在创建的工程中添加文件:
然后,反复修改 F() 函数(可将 printf() 带入其中调试),修改“case LPARE:N”
和“ default: ”中的部分, 使这段代码即可检测出缺少 ‘(’又可检测出缺少ຫໍສະໝຸດ Baidu‘)’
.
.
以及“)(”(右括号在前)或是括号中没有数字的情况。
最后,综合理解 double E();double F();void S();double T();
INTEGER;}
和 {DIGIT}+"."{DIGIT}* {yyval.fval = atof(yytext); return DOUBLE; }
这
两句代码,其中 yyval.intval = atoi(yytext)
和 yyval.fval = atof(yytext)
就说明两者可以相互替代。
.
《编译原理》课程 实验报告
题目 用递归下降法进行表达式分析
专业 班级 学号 一 . 实验题目姓名
用递归下降法进行语法分析的方法 二 . 实验日期 三 . 实验环境(操作系统,开发语言)
操作系统是 Windows 开发语言是 C 语言
四 . 实验内容(实验要求) 词法分析程序和语法分析程序已经提供。 此语法分析程序能够实现: 正确的
四个函数
以及运用“ extern VAL yyval; ”这样的语句使此代码可运用其他文件中的变量,
如 *yyin 、*yytext 。另外为了更好理解,我将个别函数中的 switch 函数修改成
if 的选择语句。
六 . 实验体会( 包括收获、心得体会、存在的问题及解决问题的方法、建议等
)
这是我们第一次接触语法分析, 用递归下降法来进行表达式的分析。 第一次
在 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
// 运用其他文件中的变量
int tokentype;
double E(); double F(); void S(); double T();
double F() // F -> (E) | int | double {
double num; tokentype=yylex(); switch(tokentype) { case INTEGER:
接触的确很陌生。
在实验中,要想进行分析,需要在 .l 文件中写出规则,然后在 .h 文件中定
义规则中的“ + - * / ( )”,将其定义为 PLUS3 、 MINUS4、TIMES5、 SLASH
6 LPAREN 7 、 RPAREN,8 这样一来, .l 文件中的规则就可运用到 syn.c 文件中
输入可以给出结果。例:输入表达式串为: (13+4)*3 则应给出结果为 51。 要求: ( 1)读懂源代码,理解内容写入实验报告(语法分析及语法分析程序和词法分 析程序的接口) ( 2)把语法分析中使用的 yyval ,用 yytext 实现。 ( 3)在语法分析程序用加入出错处理(尽量完整,包括出错的位置,出错的原
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;
去,而在用户输入的 “+-*/() ”就可传到规则中去替换成对应的字母, 进行运算。
此时的‘+’就可用“PLUS”表示;‘- ’就可用“MINUS”表示;‘* ’就可用“ TIMES”
表示;‘/ ’就可用“ SLASH”表示; ‘ ( ’就可用“ LPARE”N 表示; ‘) ’就可
用“ RPARE”N表示。另外 double E();double F();void S();double T()
四个
函数中,以 S() 函数为起始函数依次向后调用函数,直到函数 F() ,并且完成了
“先算括号内,再算 */ ,最后算 +- ”的运算顺序。
另外,实验调试中是可以让用户输入的,但代码中没有一句 scanf() 输入函
数,而在 main() 函数里有“ yyin=(char*)stdin; ”这一句代码,这就是用来输
入的,其含义就是将所输入的内容传到 yyin 中去。
这次实验让我初步了解了, 自己编写的规则是可以运用在程序代码里并能运
行的。其实如果不用这样的方法, 我们也能编写出计算表达式的代码, 但是这样
的方法去编写感觉代码要容易读懂很多,代码也显得简便了。
.
.
七 . 实验结果(关键源代码)
#include<stdio.h> #include "parser.h" extern VAL yyval; extern char *yyin; extern int yylex(); extern char *yytext;