编译原理-lex-yacc-的联合使用-实验报告(共9页)_第1页
编译原理-lex-yacc-的联合使用-实验报告(共9页)_第2页
编译原理-lex-yacc-的联合使用-实验报告(共9页)_第3页
编译原理-lex-yacc-的联合使用-实验报告(共9页)_第4页
编译原理-lex-yacc-的联合使用-实验报告(共9页)_第5页
已阅读5页,还剩4页未读, 继续免费阅读

下载本文档

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

文档简介

1、精选优质文档-倾情为你奉上编译原理课程实验报告题目 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. 在

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文件,

3、将其添加到新建工程中的Header files文件夹中,这时就能将三个文件组成一个类似于.exe文件类型的文件,最后运行。6. 运行并调试成功。六. 实验体会(包括收获、心得体会、存在的问题及解决问题的方法、建议等) 这是最后一次实验了,但这次的难度是有史以来最难的一次实验,因为要结合之前我们学到的所有东西。 首先要修改.l文件的代码,再把此文件用lex运行,即词法分析部分用lex完成;然后是修改myparser-sixth.y文件,尽管有参照的代码,但是要自己实现能对整数和实数进行带变量的四则运算,对于还没有完全掌握.y文件编写的我还是太有难度了,自己先是完成了只对实数的运算,也能运行,但只

4、要添加上实数就会出错,研究了很久,还是没有找出来哪里还有错误;有时候也会出现用yacc运行没错误,但用c-free运行就会出错,提示说.h文件有错误,找了半天,也修改了很多。却仍然不知道哪里有错。 总的来说,虽然没有完成最终的目的,但是我已经尽力了。七. 实验结果(关键源代码)Myleb.l文件代码:%option noyywrapDIGIT0-9IDa-zA-Za-zA-Z0-9*%#include<stdio.h>%DIGIT+"."DIGIT* return NUM;"/*"n*"*/" printf("3

5、3 n");"" printf("34 %sn",yytext);"+" printf("35 %sn",yytext);"-" printf("36 %sn",yytext);"*" printf("37 %sn",yytext);"/" printf("38 %sn",yytext);"(" printf("39 %sn",yytext);&q

6、uot;)" printf("40 %sn",yytext);"" printf("41 %sn",yytext);"" printf("42 %sn",yytext);"" printf("43 %sn",yytext);"" printf("44 %sn",yytext);double return DOUBLE;EOF return 0;ID return ID;. printf("100

7、%sn",yytext);%main(void)yylex();myparser-sixth.y文件代码:/*带 整数 int 和实数 double 变量声明的加减乘除四则运算 */%#include <stdio.h>#include <math.h>#include <ctype.h>#include <string.h>#include "genMidCode.h"extern char yytext20;extern SYMREC *sym_table;int id_type;SYMREC *sym; typ

8、edef 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 > INTE

9、GER%type < val > exp%start program%left '-' '+'%left '*' '/'%left UMINUS %program : func '#' ; func: |func declaration_part |func assign_stmt ; declaration_part: DOUBLE id_type = DOUBLE ; declaration_list '' | INTEGER id_type = INTEGER ; declarat

10、ion_list '' ; declaration_list : declaration_list ',' declaration |declaration ;declaration: ID sym_table = putsym2(yytext,id_type); | ID '=' NUMDOU if (id_type = INTEGER) sym_table = putsym3(yytext,id_type,$3); /* 把整型值放入符号表 */ | ID '=' NUMINT if (id_type = DOUBLE) sy

11、m_table = putsym3(yytext,id_type,$3); /* 把实型值放入符号表 */ ;assign_stmt: 'n' | ID '=' exp '' if(sym = getsym(yytext) != NULL ) if ($3.valType = 1) /* exp里是实数 */ sym_table = putsym3(yytext,id_type,$3.inval.do); else sym_table = putsym3(yytext,id_type,$3.inval.in); ; exp: NUMDOU $.v

12、alType =1; $.inval.do= $1.inval.do; /* valType =1代表实数 */ | NUMINT $.valType =2; $.inval.in= $2.inval.in; /* valType =2代表整数 */ | ID if(sym = getsym(yytext) != NULL ) if (id_type = INTEGER) $.valType =2; $.inval.in = sym->value; /* valType =2代表整数 */ else $.valType =1; $.inval.do = sym->value; /*

13、 valType =1代表实数 */ else ("此变量没定义n "); | exp '+' exp if($1.valType =1 && $3.valType =1 ) $.valType =1 ;$.inval.do= $1.inval.do + $3.inval.do ; else | exp '-' exp | exp '*' exp | exp '/' exp | '-' exp %prec UMINUS ;%int yyerror(char *s) printf(

14、"%sn", s); return 0;int main(void) yyparse(); return 0;int yylex() / 用lex实现如下的功能int c;while (c = getchar()=' ' | c='t');if (c = '.' | isdigit(c)ungetc(c,stdin);scanf("%lf",&yylval.val);return NUMDOU;if(isalpha(c) char symbuf20; int i=0; dosymbufi = c;i+;c = getchar(); while(c != EOF && isalnum(c);unge

温馨提示

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

评论

0/150

提交评论