编译原理 lex yacc 的联合使用 实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《编译原理》课程
实验报告
题目lex yacc 的联合使用
专业
班级
学号
姓名
一. 实验题目
lex yacc 的联合使用
二. 实验日期
三. 实验环境(操作系统,开发语言)
操作系统是Windows
开发语言是C语言
四. 实验内容(实验要求)
目的:熟悉lex和yacc的接口
要求:
(1)能对整数、实数进行带变量的四则运算
(2)词法分析用lex实现
(3)语法分析用yacc实现
(4)交源代码和实验报告
五. 实验步骤
1.在实验二的基础上修改代码,并添加上以下的代码:
double { return DOUBLE;}
EOF { return 0;}
{ID} { return ID;}
2.在DOS环境下按照之前的步骤利用flex运行myleb.l,修改其中的错误之后,生成lex.yy.c文件。
3.参照书中第14章第7节和myparser-fifth.y文件中的代码,和老师说的思路修改myparser-sixth.y文件,按照实验要求修改代码。
4.在DOS环境下利用yacc运行myparser-sixth.y文件,会有出错提示,按照出错的地方指示,修改代码,使其最终能通过运行,生成y.tab.c文件。(此步骤还未完成)
5.打开c-free5.0,新建工程,在Source files文件夹中添加之前生成的lex.yy.c文件和y.tab.c文件,然后找到已给的calc.h文件,将其添加到新建工程中的Header files文件夹中,这时就能将三个文件组成一个类似于.exe文件类型的文件,最后运行。
6.运行并调试成功。
六. 实验体会(包括收获、心得体会、存在的问题及解决问题的方法、建议等)
这是最后一次实验了,但这次的难度是有史以来最难的一次实验,因为要结合之前我们学到的所有东西。
首先要修改.l文件的代码,再把此文件用lex运行,即词法分析部分用lex 完成;然后是修改myparser-sixth.y文件,尽管有参照的代码,但是要自己实现能对整数和实数进行带变量的四则运算,对于还没有完全掌握.y文件编写的我还是太有难度了,自己先是完成了只对实数的运算,也能运行,但只要添加上实数就会出错,研究了很久,还是没有找出来哪里还有错误;有时候也会出现用yacc运行没错误,但用c-free运行就会出错,提示说.h文件有错误,找了半天,也修改了很多。却仍然不知道哪里有错。
总的来说,虽然没有完成最终的目的,但是我已经尽力了。
七. 实验结果(关键源代码)
Myleb.l文件代码:
%option noyywrap
DIGIT[0-9]
ID[a-zA-Z][a-zA-Z0-9]*
%{
#include
%}
%%
{DIGIT}+"."{DIGIT}* { return NUM;}
"/*"[^}\n]*"*/" printf("33 \n");
"^" printf("34 %s\n",yytext);
"+" printf("35 %s\n",yytext);
"-" printf("36 %s\n",yytext);
"*" printf("37 %s\n",yytext);
"/" printf("38 %s\n",yytext);
"(" printf("39 %s\n",yytext);
")" printf("40 %s\n",yytext);
"[" printf("41 %s\n",yytext);
"]" printf("42 %s\n",yytext);
"{" printf("43 %s\n",yytext);
"}" printf("44 %s\n",yytext);
double { return DOUBLE;}
EOF { return 0;}
{ID} { return ID;}
. printf("100 %s\n",yytext);
%%
main(void)
{
yylex();
}
myparser-sixth.y文件代码:
/*带整数 int 和实数 double 变量声明的加减乘除四则运算 */ %{
#include
#include
#include
#include
#include "genMidCode.h"
extern char yytext[20];
extern SYMREC *sym_table;
int id_type;
SYMREC *sym;
typedef struct{
union inval{
double do;
int in;
}
int valType;
} VALUE;
%}
//定义语义栈的数据类型有两种数据类型整数和实数仿照 p252 中间union部分
%union {
VALUE val;
SYMREC *tptr;
int type;
}
// 终结符和非终结符对应的符号类型,自己定义
%token < val > NUMDOU
%token < val > NUMINT
%token < tptr> ID
%token < type > DOUBLE
%token < type > INTEGER
%type < val > exp
%start program
%left '-' '+'