编译原理课程设计实验报告1

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

中国海洋大学实验报告姓名:邓汇星专业年级:2012级计算机学号:12020031016同组人:窦猛专业年级:2012级计算机学号:12020031020编译原理课程设计实验报告【实验题目】:实验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的代码进行修改,添加对一些符号的定义,设计成为一个新的此法分析器,使得改词法分析器能够对实验要求的记号进行识别,识别效果如下:PROGRAMtest;VARi,j,k:INTEGER;f0:REAL;BEGINi:=1;j:=1;k:=0;f0:=3.2;WHILEk=100DOBEGINIFj20THENBEGINj:=i;k:=k+1;f0:=f0*0.2ENDELSEBEGINj:=k;k:=k-2;f0:=f0/.2ENDENDEND.【实验结果截图】;程序用flex和gcc编译调试通过后,以test1.p中的内容座位输入进行词法分析得到以下结果:test1.p的内容如下:PROGRAMtest;VARi,j,k:INTEGER;f0:REAL;BEGINi:=1;j:=1;k:=0;f0:=3.2;WHILEk=100DOBEGINIFj20THENBEGINj:=i;k:=k+1;f0:=f0*0.2ENDELSEBEGINj:=k;k:=k-2;f0:=f0/.2ENDENDEND.【实验程序代码】/*把讨厌的注释去掉*/%{#includestdio.h#defineLT1#defineLE2#defineGT3#defineGE4#defineEQ5#defineNE6#defineWHILE18#defineDO19#defineID20#defineNUMBER21#defineRELOP22#defineNEWLINE23#defineERRORCHAR24#define_PROGRAM25#define_VAR26#define_INTEGER27#define_REAL28#define_END29#define_THEN30#definefenhao31#definemaohao32#definedouhao33#definejiahao34#definechuhao35#definedian36#definechenghao37#definejianhao38#define_BEGIN39#define_ELSE40%}delim[\t\n]ws{delim}+letter[A-Za-z]digit[0-9]id{letter}({letter}|{digit})*number{digit}+(\.{digit}+)?(E[+-]?{digit}+)?/*状态(或条件)定义可以定义在这里*INITIAL是一个默认的状态,不需要定义*/%sCOMMENT%%INITIAL/*{BEGINCOMMENT;ECHO;}COMMENT*/{BEGININITIAL;ECHO;}COMMENT.|\n{ECHO;}/*ECHO是一个宏,相当于fprintf(yyout,%s,yytext)*/INITIAL{ws}{;}INITIALwhile{return(WHILE);}INITIALWHILE{return(WHILE);}INITIALdo{return(DO);}INITIALELSE{return(_ELSE);}INITIALPROGRAM{return(_PROGRAM);}INITIALBEGIN{return(_BEGIN);}INITIALVAR{return(_VAR);}INITIALINTEGER{return(_INTEGER);}INITIALEND{return(_END);}INITIALREAL{return(_REAL);}INITIALTHEN{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.{returnERRORCHAR;}%%intyywrap(){return1;}voidwriteout(intc){switch(c){caseERRORCHAR:fprintf(yyout,(ERRORCHAR,\%s\),yytext);break;caseRELOP:fprintf(yyout,(RELOP,\%s\),yytext);break;caseWHILE:fprintf(yyout,(WHILE,\%s\),yytext);break;caseDO:fprintf(yyout,(DO,\%s\),yytext);break;caseNUMBER:fprintf(yyout,(NUM,\%s\),yytext);break;caseID:fprintf(yyout,(ID,\%s\),yytext);break;caseNEWLINE: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;casemaohao:fprintf(yyout,(maohao),yytext);break;casefenhao:fprintf(yyout,(fenhao),yytext);break;casedouhao:fprintf(yyout,(douhao),yytext);break;casejiahao:fprintf(yyout,(jiahao),yytext);break;casechuhao:fprintf(yyout,(chuhao),yytext);break;casedian:fprintf(yyout,(dian),yytext);break;casechenghao:fprintf(yyout,(chenghao),yytext);break;casejanhao:fprintf(yyout,(janhao),yytext);break;case_ELSE:fprintf(yyout,(ELSE),yytext);break;default:break;}fprintf(yyout,\n);return;}intmain(intargc,char**argv){intc,j=0;if(argc=2){if((yyin=fopen(argv[1],r))==NULL){printf(Can'topenfile%s\n,argv[1]);return1;}if(argc=3){yyout=fopen(argv[2],w);}}while(c=yylex()){writeout(c);j++;if(j%5==0)writeout(NEWLINE);}if(argc=2){fclose(yyin);if(argc=3)fclose(yyout);}return0;}【实验心得】通过本次实验,我们学会了在cygwin下用flex编译程序,并成功写了一个词法分析器能够对实验要求中给出的测试样例进行正确无误的词法分析。这使得我们进一步学会用lex来写词法分析器,也让我们对编译原理课上所学关于词法分析器的部分有了更为深刻的认识和理解。

1 / 9
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功