您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 编译原理课程设计实验报告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
链接地址:https://www.777doc.com/doc-4826869 .html