编译原理课程设计实验报告(共9页).docx
精选优质文档-倾情为你奉上中 国 海 洋 大 学 实 验 报 告 姓名:邓汇星 专业年级:2012级计算机 学号: 同组人: 窦猛 专业年级:2012级计算机 学号: 编译原理课程设计实验报告【实验题目】:实验1:用Lex设计词法分析器1【实验目的】:学会用lex设计一个词法分析器。【实验内容】:使用lex为下述文法语言写一个词法分析器。语言文法:<程序>à PROGRAM <标识符> ; <分程序><分程序>à <变量说明> BEGIN <语句表> END.<变量说明> à VAR <变量说明表><变量说明表>à<变量表>: <类型> | <变量表>: <类型> <变量说明表><类型>à INTEGER | REAL<变量表>à <变量> | <变量>, <变量表><语句表>à <语句> | <语句> <语句表><语句>à <赋值语句> | <条件语句> | <WHILE语句> | <复合语句><赋值语句>à<变量> := <算术表达式><条件语句>à IF <关系表达式> THEN <语句> ELSE <语句><WHILE语句>à WHILE <关系表达式> DO <语句><复合语句> à BEGIN <语句表> END<算术表达式> à <项> | <算术表达式> + <项> | <算术表达式> - <项><项> à <因式> | <项> * <因式> | <项> / <因式><因式>à <变量> | <常数> | (<算术表达式>)<关系表达式>à <算术表达式> <关系符> <算术表达式><变量>à <标识符><标识符>à <标识符><字母> | <标识符><数字> | <字母><常数>à <整数> | <浮点数><整数>à <数字> | <数字> <整数><浮点数>à .<整数> | <整数>.<整数><关系符>à < | <= | = | > | >=| <><字母>à A | B | | X | Y | Z | a | b | | x | y | z<数字>à0|1|2|9【实验要求】:输入为用该语言所写的源程序文件;输出为记号序列,每个记号显示为二元组(记号名,记号属性值)的形式。输出可以在屏幕上,也可以输出到文件中。不要求建立符号表。在cygwin下用flex和gcc工具将实验调试通过,并能通过例子parser0中testcases目录下的test1.p测试例的测试。【实验参考】:exam1.l和exam2.l。请认真阅读例子,发现错误及时提出。【实验过程】:根据编译原理实验的exam1.l和exam2.l的代码进行修改,添加对一些符号的定义,设计成为一个新的此法分析器,使得改词法分析器能够对实验要求的记号进行识别,识别效果如下:PROGRAM test;VAR i, j, k: INTEGER; f0: REAL;BEGIN i := 1; j := 1; k := 0; f0 := 3.2; WHILE k<=100 DO BEGIN IF j <20 THEN BEGIN j := i; k := k+1; f0 := f0*0.2 END ELSE BEGIN j := k; k := k-2; f0 := f0/.2 END ENDEND.【实验结果截图】;程序用flex和gcc编译调试通过后,以test1.p中的内容座位输入进行词法分析得到以下结果:test1.p的内容如下:PROGRAM test;VAR i, j, k: INTEGER; f0: REAL;BEGIN i := 1; j := 1; k := 0; f0 := 3.2; WHILE k<=100 DO BEGIN IF j <20 THEN BEGIN j := i; k := k+1; f0 := f0*0.2 END ELSE BEGIN j := k; k := k-2; f0 := f0/.2 END ENDEND.【实验程序代码】/* 把讨厌的注释去掉 */%#include <stdio.h> #define LT1#defineLE2#define GT3#defineGE4#defineEQ5#define NE6#define WHILE18#defineDO19#define ID 20#define NUMBER 21#define RELOP 22#define NEWLINE 23#define ERRORCHAR 24#define _PROGRAM 25#define _VAR 26#define _INTEGER 27#define _REAL 28#define _END 29#define _THEN 30#define fenhao 31#define maohao 32#define douhao 33#define jiahao 34#define chuhao 35#define dian 36#define chenghao 37#define jianhao 38#define _BEGIN 39#define _ELSE 40% delim t nwsdelim+letterA-Za-zdigit0-9idletter(letter|digit)*numberdigit+(.digit+)?(E+-?digit+)?/* 状态(或条件)定义可以定义在这里 * INITIAL是一个默认的状态,不需要定义 */%s COMMENT%<INITIAL>"/*"BEGIN COMMENT;ECHO;<COMMENT>"*/"BEGIN INITIAL;ECHO;<COMMENT>.|nECHO; /* ECHO是一个宏,相当于 fprintf(yyout, "%s", yytext)*/<INITIAL>ws ;<INITIAL>whilereturn (WHILE);<INITIAL>"WHILE"return(WHILE);<INITIAL>do return (DO);<INITIAL>"ELSE"return(_ELSE);<INITIAL>"PROGRAM" return (_PROGRAM);<INITIAL>"BEGIN"return (_BEGIN);<INITIAL>"VAR" return (_VAR);<INITIAL>"INTEGER" return (_INTEGER);<INITIAL>"END" return (_END);<INITIAL>"REAL" return (_REAL);<INITIAL>"THEN" return (_THEN);<INITIAL>number return (NUMBER);<INITIAL>id return (ID);<INITIAL>"<" return (RELOP);<INITIAL>"<=" return (RELOP);<INITIAL>"=" return (RELOP);<INITIAL>"<>" return (RELOP);<INITIAL>">" return (RELOP);<INITIAL>">=" return (RELOP);<INITIAL>":=" return (RELOP);<INITIAL>""return (fenhao);<INITIAL>"," return (douhao);<INITIAL>":" return (maohao);<INITIAL>"+" return (jiahao);<INITIAL>"-" return (jianhao);<INITIAL>"*" return (chenghao);<INITIAL>"/" return (chuhao);<INITIAL>"." return (dian);<INITIAL>. return ERRORCHAR; %int yywrap () return 1;void writeout(int c) switch(c) case ERRORCHAR: fprintf(yyout, "(ERRORCHAR, "%s") ", yytext);break; case RELOP: fprintf(yyout, "(RELOP, "%s") ", yytext);break; case WHILE: fprintf(yyout, "(WHILE, "%s") ", yytext);break; case DO: fprintf(yyout, "(DO, "%s") ", yytext);break; case NUMBER: fprintf(yyout, "(NUM, "%s") ", yytext);break; case ID: fprintf(yyout, "(ID, "%s") ", yytext);break; case NEWLINE: fprintf(yyout, "n");break;case _PROGRAM: fprintf(yyout,"(PROGRAM)");break; case _BEGIN: fprintf(yyout,"(BEGIN)");break;case _VAR: fprintf(yyout, "(VAR)", yytext); break;case _INTEGER: fprintf(yyout, "(INTEGER)", yytext); break;case _REAL: fprintf(yyout, "(REAL)", yytext); break;case _END: fprintf(yyout, "(END)", yytext); break;case _THEN: fprintf(yyout, "(THEN)", yytext); break;case maohao:fprintf(yyout, "(maohao)", yytext); break;case fenhao: fprintf(yyout, "(fenhao)", yytext); break;case douhao: fprintf(yyout, "(douhao)", yytext); break;case jiahao: fprintf(yyout, "(jiahao)", yytext); break;case chuhao: fprintf(yyout, "(chuhao)", yytext); break;case dian: fprintf(yyout, "(dian)", yytext); break;case chenghao: fprintf(yyout, "(chenghao)", yytext); break;case janhao: fprintf(yyout, "(janhao)", yytext); break;case _ELSE: fprintf(yyout, "(ELSE)", yytext); break; default:break; fprintf(yyout, "n"); return;int main (int argc, char * argv)int c,j=0;if (argc>=2) if (yyin = fopen(argv1, "r") = NULL) printf("Can't open file %sn", argv1); return 1; if (argc>=3) yyout=fopen(argv2, "w"); while (c = yylex()writeout(c);j+;if (j%5 = 0) writeout(NEWLINE);if(argc>=2) fclose(yyin); if (argc>=3) fclose(yyout);return 0;【实验心得】通过本次实验,我们学会了在cygwin下用flex编译程序,并成功写了一个词法分析器能够对实验要求中给出的测试样例进行正确无误的词法分析。这使得我们进一步学会用lex来写词法分析器,也让我们对编译原理课上所学关于词法分析器的部分有了更为深刻的认识和理解。专心-专注-专业