编译原理课程设计报告一、设计概述(设计目的、环境、要求)1、设计目的本次课程设计的目的是通过使用一个通用的能够自动根据正规表达式生成词法分析程序的工具程序设计一个简单语言的词法分析器,使学生充分理解课程理论内容和工具软件的使用技巧,掌握所涉及的典型数据结构,算法及方法,为今后在大型软件系统实践中设计性能优良的软件系统打下基础。2、设计环境实验环境为Windows操作系统下,词法分析使用的主要工具是flex。3、设计要求使用Flex工具,实现Decaf语言词法分析工作,对Decaf语言编写的源程序从左至右逐个字符进行扫描,产生一个单词序列。二、实验步骤(包括基本程序的分析步骤、测试的例子)1、编写程序的分析步骤(1)根据pp2所提供的scanner.l文件修改我们所需的词法分析程序scanner.l。/**scanner.l**Flex输入文件,生成scanner*/%{#includestdlib.h#includestdio.h#includeprocess.h#includemalloc.h#includestring.h#includescanner.h#includehashtable.h#includeutility.h#includeio.h/**Globalvariable:yylval*-----------------------*全局变量,我们可以从yylval中获得每个token的属性。*以后这个变量由bison/yacc自动生成,在这个实验里面,我们手动定义。*/YYSTYPEyylval;/**Globalvariable:yylloc*-----------------------*全局变量,我们可以从yylloc中获得每个token的位置属性。*以后也由bison/yacc自动生成。编译原理课程设计报告*/structyyltypeyylloc;staticintcurLineNum,curColNum;staticcharcurLine[512];staticvoidDoBeforeEachAction();#defineYY_USER_ACTIONDoBeforeEachAction();Hashtablehasht;%}%optionstack%sNC%xCOPY/**在这里定义你的辅助定义和开始条件*/decimal[0-9]HEX_decimal({decimal}|[a-fA-F])+HEX_INTEGER0[Xx]{HEX_decimal}+INTEGER{decimal}+EXPONENT[Ee][-+]{INTEGER}DOUBLE({INTEGER}(.){decimal}*{EXPONENT}?)BEG_STRING(\[^\n]*)STRING({BEG_STRING}\)IDENTIFIER([a-zA-Z][a-zA-Z0-9_]*)OPERATOR[+\-*/%=\\,.;!(){}\[\]]BEG_COMMENT(/*)END_COMMENT(*/)SINGLE_COMMENT(//[^\n]*)WHITE[\t]*/**以下是你的识别规则(patten&action)。*注意空格问题和括号\引号匹配问题,一旦出错很难查出。*/%%COPY.*{strncpy(curLine,yytext,sizeof(curLine));curColNum=1;yy_pop_state();yyless(0);}COPYEOF{yy_pop_state();}*\n{curLineNum++;curColNum=1;if(YYSTATE!=COPY)yy_push_state(COPY);}{WHITE}{/*ignorespace&tabsinnormalorcomment*/}/*--------------------Comments-----------------------------*/{BEG_COMMENT}{yy_push_state(C);}C{END_COMMENT}{yy_pop_state();}CEOF{ReportError(&yylloc,Inputendswithunterminatedcomment.);return0;}C[^*\n/]*{/*graballnon-star,non-slash,non-newline*/}C.{/*ignoreeverythingelsethatdoesn'tmatch*/}N{SINGLE_COMMENT}{/*skiptoendoflinefor//comment*/}/*---------------------Keywords-------------------------------*/Nvoid{returnT_Void;}编译原理课程设计报告Nint{returnT_Int;}Ndouble{returnT_Double;}Nbool{returnT_Bool;}Nstring{returnT_String;}Nclass{returnT_Class;}Nextends{returnT_Extends;}Nthis{returnT_This;}Nnull{returnT_Null;}Nwhile{returnT_While;}Nfor{returnT_For;}Nif{returnT_If;}Nelse{returnT_Else;}Nreturn{returnT_Return;}NNew{returnT_New;}NNewArray{returnT_NewArray;}NPrint{returnT_Print;}NReadInteger{returnT_ReadInteger;}NReadLine{returnT_ReadLine;}/*--------------------Operators-----------------------------*/N={returnT_LessEqual;}N={returnT_GreaterEqual;}N=={returnT_Equal;}N!={returnT_NotEqual;}N&&{returnT_And;}N||{returnT_Or;}N{OPERATOR}{returnyytext[0];}/*--------------------Constants------------------------------*/Ntrue|false{yylval.boolConstant=(yytext[0]=='t');returnT_BoolConstant;}N{INTEGER}{yylval.integerConstant=strtol(yytext,NULL,10);returnT_IntConstant;}N{HEX_INTEGER}{yylval.integerConstant=strtol(yytext,NULL,16);returnT_IntConstant;}N{DOUBLE}{yylval.doubleConstant=atof(yytext);returnT_DoubleConstant;}N{STRING}{strcpy(yylval.stringConstant,yytext);returnT_StringConstant;}N{BEG_STRING}/\n{ReportError(&yylloc,Illegalnewlineinstringconstant%s,yytext);}N{BEG_STRING}{ReportError(&yylloc,Inputendswithunterminatedstring%s,yytext);}/*--------------------Identifiers---------------------------*/N{IDENTIFIER}{Declaration*temp;if((temp=hasht.st_lookup(strdup(yytext)))==NULL){temp=newDeclaration(yytext,yylloc.first_line,1);hasht.st_insert(*temp);}else{编译原理课程设计报告temp-IncrementOccurrences();}yylval.decl=temp;returnT_Identifier;}/*--------------------Defaultrule(error)--------------------*/N.{ReportError(&yylloc,Unrecognizedchar:'%c',yytext[0]);}%%voidyyerror(char*msg){ReportError(&yylloc,%s,msg);}voidInityylex(){BEGIN(N);//StartinNormalstateyy_push_state(COPY);//butcopyfirstlineatstartcurLineNum=1;curColNum=1;}intyywrap(){return(1);}staticvoidDoBeforeEachAction(){yylloc.first_line=curLineNum;yylloc.first_column=curColNum;yylloc.last_column=curColNum+yyleng-1;curColNum+=yyleng;}constchar*GetLineNumbered(intnum){return(num==curLineNum)?curLine:NULL;}(2)根据pp1所提供的SYMTAB.C和SYMTAB.H文件修改我们所需要的哈希表的头文件hashtable.h和实现哈希表的程序hashtable.cpp①由于在数据结构方面为了实现很方便的进行查找,插入,删除等操作。于是把它的数据结构设计成一哈稀表结构,哈稀表的查找,插入等操作是快速的。所设计的哈稀结构符号表结构如下:编译原理课程设计报告②对标识符的处理③程序《hashtable.cpp》/*Hashtable.cpp:addyourcodebelow:*/#includestdio.h#includestdlib.h#includedeclaration.h#includehashtable.h/*SHIFTisthepoweroftwousedasmultiplierinhashfunction*/#defineSHIFT4intHashtable::hash(constchar*key){inttemp=0;inti=0;while(key[i]!='\0'){temp=((tempSHIFT)+key[i])%SIZE;++i;}returntemp;}voidHashtable::st_insert(Declarationdeclation){inth=hash(declation.GetName());LineListl=hashTable[h];while((l!=NULL)&&(strcmp(declation.GetName(),l-declation.GetName())!=0))l=l-next;if(l==NULL)Y查找,返回对象指针找到否?N出现次数+1生成一个新的对象然后插入将数据赋值给yylva.decl编译原理课程设计报告{l=(LineList)malloc(sizeof(structLineListRec));l-declation=declation;l-next=hashT