您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 河北工业大学编译原理实验报告
编译原理实验报告组员:韦廷廷(112455)、熊敏(112456)、马昊(113042)任课老师:吴清一、任务概述本次实验我们要完成的任务主要是实现一个简单语言集的词法、语法和语义分析程序,验证实际编译系统的实现方法。我们组的分工并不是词法分析、语法分析、语义分析每人负责一个,而是先确定每种分析按照哪一种方法实现,然后每个人写出自己的想法,按照自己的想法实验,最后总结到一起,有问题大家一起讨论,共同商量解决的办法。二、系统设计实验采用的实现方法和依据:语言中的各类单词符号及其分类码表单词符号类别编码类别码的助记符单词值begin1BEGINend2ENDif3IFthen4THENelse5ELSE标识符6ID字母打头的字母数字串无符号常数7UCON机内二进制表示8LT=9LE=10EQ11NE12GT=13GE:=14IS+15PL-16MI*17MU/18DI实验采用的实现方法和依据:文法:E→T|E+T|E-TT→F|T*F|T/FF→i|(E)SLR(1)分析表状态ACTIONGOTO()+-*/i#ETF0S4S51231S6S7Acc2R3R3R3S8S9R33R6R6R6R6R6R64S4S510235R8R8R8R8R8R86S4S51137S4S51238S4S5139S4S51410S15S6S711R1R1R1S8S9R112R2R2R2S8S9R213R4R4R4R4R4R414R5R5R5R5R5R515R7R7R7R7R7R7三、系统实现(包括必要的框图,各.h和.c文件说明,所有函数功能的说明,数据结构、各种表格、变量等的说明,以及函数调用关系图等)(1)各.h和.c文件说明Cifa.cpp的功能:字符串扫描识别。Table.cpp的功能:存放SLR分析法需要用到的ACTION和GOTO表。Yufa.cpp的功能:引用Cifa.cpp、Table.cpp两个文件进行语法、语义的分析。(2)函数功能说明词法分析部分函数说明:intlookup(char*token)//比较是否是关键字intGetChar(charch)//每调用一次,就把扫描指示器当前所指示的源程序字符送入字符变量ch,然后把扫描指示器前推一个字符位置。intHandleError(void)//报错函数intEXCUTE(intstate,intsymbol)//状态转换intlookup(char*token)//比较是否是关键字voidout(inta,char*token)//输出函数voidscanner_example(FILE*fp)//词法分析语法、语义部分函数功能说明:voidREPORT_ERROR()//报错函数voidAccept()//语法成功接受intINDEX(chara)//获取当前字符串对应的索引voidyuyi(intn)//语义子程序voidINPUT(inta)//语法分析程序(2)数据结构、各种表格、变量等的说明Cifa.cpp中:char*KeyWordTable[MAX_KEY_NUMBER]={begin,end,if,then,else,KEY_WORD_END};//数组指针关键字intw,n,p,e,d;//w尾数累加器,n小数位数计数器,p指数累加器,e指数符号标记,intClass;//标识单词类型Table.cpp#defineMAXROW16//行数#defineMAXCOL11//列数intTable[MAXROW][MAXCOL]Yufa.cpp中#defineNUMBER9//表达式的个数intState[MAXState];//状态栈intCURRENTSTATE=0;//标识当前状态intLENGTH[NUMBER]={1,3,3,1,3,3,1,3,1};//表达式右边的长度intYes=0;//判断是否结束inttag=0;//判断是否需要调用词法程序四、系统工作过程及运行说明(使用操作指南)程序使用:在工程里创建一个b.txt文件以识别算数运算表达式五、源程序清单(要求有详细注释)和实例程序运行结果源程序清单:Cifa.cpp#includestdio.h#includectype.h#includestdlib.h#includestring.h#includemath.h#defineDIGIT1#definePOINT2#defineOTHER3#definePOWER4#defineID6#defineUCON7#defineLT8#defineLE9#defineEQ10#defineNE11#defineGT12#defineGE13#defineIS14#definePL15//+#defineMI16//-#defineMU17#defineDI18#definezuokuohao19#defineyoukuohao20#definejin21#defineClassOther200#defineEndState-1#defineMAX_KEY_NUMBER20/*关键字的数量*/#defineKEY_WORD_ENDEND/*关键字结束标记*/char*KeyWordTable[MAX_KEY_NUMBER]={begin,end,if,then,else,KEY_WORD_END};//数组指针charTOKEN[20];charch;intw,n,p,e,d;//w尾数累加器,n小数位数计数器,p指数累加器,e指数符号标记,intClass;//标识单词类型intICON;doubleFCON;staticintCurrentState=0;intresult;intstart=0;//指示程序的开始intend=0;//指示程序的结束intGetChar(void);intEXCUTE(int,int);intHandleOtherWord(void){returnClassOther;}intHandleError(void){printf(Error!\n);return0;}intlookup(char*token)//比较是否是关键字{intn=0;while(strcmp(KeyWordTable[n],KEY_WORD_END))/*strcmp比较两串是否相同,若相同返回0*/{if(!strcmp(KeyWordTable[n],token))/*比较token所指向的关键字和保留字表中哪个关键字相符*/{returnn+1;/*根据单词分类码表I,设置正确的关键字类别码,并返回此类别码的值*/break;}n++;}return0;/*单词不是关键字,而是标识符*/}intGetChar(chara){charc=a;if(isdigit(c)){d=c-'0';//字符c与字符0的ascii码差值,返回类型为一个整数returnDIGIT;}if(c=='.')returnPOINT;if(c=='E'||c=='e')returnPOWER;if(c=='+')returnPL;if(c=='-')returnMU;returnOTHER;}voidreport_error(){printf(错误\n);}voidout1(inta,char*token)//输出函数{switch(a){case1:printf((BEGIN,)\n);break;case2:printf((END,)\n);break;case3:printf((IF,)\n);break;case4:printf((THEN,)\n);break;case5:printf((ELSE,)\n);break;case6:printf((ID,%s)\n,token);break;case8:printf((LT,%s)\n,token);break;case9:printf((LE,%s)\n,token);break;case10:printf((EQ,%s)\n,token);break;case11:printf((NE,%s)\n,token);break;case12:printf((GT,%s)\n,token);break;case13:printf((GE,%s)\n,token);break;case14:printf((IS,%s)\n,token);break;case15:printf((PL,%s)\n,token);break;case16:printf((MI,%s)\n,token);break;case17:printf((MU,%s)\n,token);break;case18:printf((DI,%s)\n,token);break;case19:printf(((,)\n);break;case20:printf((),)\n);break;default:report_error();break;}}intout(inta){switch(a){case7:return6;break;//常量case15:return2;break;//+case16:return3;break;case17:return4;break;case18:return5;break;case19:return0;break;case20:return1;break;case21:return7;break;case22:return100;break;//判断是否是空格或换行case26:return26;break;//标识符default:return001;report_error();break;}}voidscanner_example(FILE*fp)//文件扫描器{inti,c;ch=fgetc(fp);if(ch==''||ch=='\n'){scanner_example(fp);}elseif(isalpha(ch))//判断是否是英文字母{TOKEN[0]=ch;ch=fgetc(fp);i=1;while(isalnum(ch)){TOKEN[i]=ch;i++;ch=fgetc(fp);}TOKEN[i]='\0';fseek(fp,-1,1);/*retract*/c=lookup(TOKEN);if(c==0){//printf(算术表达式不需要\n);result=out(26);//标识符}else{if(c==1){start=1;out1(c,);}if(c==2){end=1;out1(c,);}}}elseif(isdigit(ch)||ch=='.')//判断是否是数字或“.”{i=0;//TOKEN[i]=ch;if(isdigit(ch)){d=ch-'0';//字符c与字符0的ascii码差值,返回类型为一个整数EXCUTE(CurrentState,DIGIT);}if(ch=='.')EXCUTE(CurrentState,POINT);if(ch=='E'||ch=='e')EXCUTE(CurrentState,POWER);if(ch=='+')EXCUTE(CurrentState,PL);if(ch=='-')EXCUTE(CurrentState,MU);while(CurrentState!=EndState){TOKEN[i]=ch;i++;ch=fgetc(fp);intc=GetChar(ch);EXCUTE(CurrentState,c);}TOKEN[i]='\0';fseek(fp,-1,1);//printf((UCON,%g)\n,FCON);result=out(UCON);}elseswitch(ch)//关系运算符{case'':ch=fgetc(fp);if(ch=='=')out1(LE,);elseif(ch=='')out1(NE,);else{fseek(fp,-
本文标题:河北工业大学编译原理实验报告
链接地址:https://www.777doc.com/doc-5173301 .html