版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
課程名稱編譯原理專業(yè)班級姓名學(xué)號實(shí)驗(yàn)一詞法分析器設(shè)計(jì)【實(shí)驗(yàn)?zāi)康摹?.熟悉詞法分析的基本原理,詞法分析的過程以及詞法分析中要注意的問題。2.復(fù)習(xí)高級語言,進(jìn)一步加強(qiáng)用高級語言來解決實(shí)際問題的能力。3.通過完成詞法分析程序,了解詞法分析的過程?!緦?shí)驗(yàn)內(nèi)容】用C語言編寫一個(gè)PL/0詞法分析器,為語法語義分析提供單詞,使之能把輸入的字符串形式的源程序分割成一個(gè)個(gè)單詞符號傳遞給語法語義分析,并把分析結(jié)果(基本字,運(yùn)算符,標(biāo)識符,常數(shù)以及界符)輸出?!緦?shí)驗(yàn)步驟和要求】要求繪出詞法分析過程的流程圖。根據(jù)詞法分析的目的以及內(nèi)容,確定完成分析過程所需模塊。寫出每個(gè)模塊的源代碼。整理程序清單及所得結(jié)果?!玖鞒虉D】【源代碼】//resource.h#defineIDD_MAINDLG101#defineIDR_MENU102#defineIDI_ICON104#defineIDC_INPUT1001#defineIDC_OUTPUT1003#defineIDC_ERRPUT1004#defineIDC_BUTTON11005#defineID_START40001#defineID_ABOUT40003#defineID_OPEN40005#defineID_SAVE40006#defineID_LISTKEY40007//Nextdefaultvaluesfornewobjects//#ifdefAPSTUDIO_INVOKED#endif#endif//getsym.h#ifndef_GETSYM_H_#define_GETSYM_H_#include<stdlib.h> //Formemset()#include<string.h> //Forstrcpy()#defineISLETTER(c) ((c)>='A'&&(c)<='Z'||(c)>='a'&&(c)<='z')#defineISNUMBER(c) ((c)>='0'&&(c)<='9')#defineISCHAR(c) ((c)>=33&&(c)<=126)#defineMAX_SYM 32768 //最大符號量#defineMAX_SYMFORM 1024 //最大符號表長度#define MAX_NUMFORM 4096 //最大常數(shù)表長度#defineMAX_SYMLEN 31 //最大符號長度#defineMAX_NUMLEN 10 //最大常數(shù)長度#defineMAX_BUFFER MAX_SYMLEN+1//最大緩沖長度#defineMAX_KEYWORD 27 //關(guān)鍵字?jǐn)?shù)量#defineMAX_OPWORDA 8 //單字運(yùn)算符數(shù)量#defineMAX_OPWORDB 4 //雙字運(yùn)算符數(shù)量#defineMAX_ENDWORD 8 //單字界符數(shù)量#defineMAX_ERROR 5 //錯(cuò)誤類型數(shù)量#defineTYPE_KEYWORD 1 //關(guān)鍵字類型號#defineTYPE_SYMBOL 2 //符號類型號#defineTYPE_NUMBER 3 //常量類型號#defineTYPE_OPWORD 4 //運(yùn)算符類型號#defineTYPE_ENDWORD 5 //界符類型號#defineTYPE_ERROR -1 //錯(cuò)誤類型號#defineERR_OVERSYMLEN 1 //以下是一般錯(cuò)誤號#defineERR_OVERNUMLEN 2#defineERR_NUMBER 3#defineERR_WRONGOP 4#defineERR_OVERSYMFORM 10001 //以下是嚴(yán)重錯(cuò)誤號#defineERR_OVERNUMFORM10002#defineERR_OVERSYMNUM 10003#defineERR_OVERERRNUM 10004#ifdef__cplusplusextern"C"{#endifstructSYM //符號描述結(jié)構(gòu)體(含錯(cuò)誤描述結(jié)構(gòu))};structFORM //表格結(jié)構(gòu)體{ intsymnum; intnumnum; structSYMF //符號表項(xiàng)結(jié)構(gòu)體 { intid; charname[MAX_SYMLEN+1]; }symf[MAX_SYMFORM]; structNUMF //常量表項(xiàng)結(jié)構(gòu)體 { intid; charname[MAX_NUMLEN+1]; }numf[MAX_NUMFORM];};structSYMINFO //詞法分析信息結(jié)構(gòu)體{ intnum; structSYMsym[MAX_SYM]; structFORMform;};//取詞函數(shù)(返回讀字符數(shù)量,如果是0則表示結(jié)束,lin表示當(dāng)前行數(shù))int__stdcallgetsym(constchar*in,structSYM*out,int*ln,structFORM*form);//取所有詞函數(shù)(正常返回0,否則返回嚴(yán)重錯(cuò)誤號)int__stdcallgetsyminfo(constchar*in,structSYMINFO*out);#ifdef__cplusplus}#endif#endif#include"getsym.h"http://關(guān)鍵字[BASIC:13,EXTEND:14]constchar*constkeytxt[MAX_KEYWORD]={ "procedure","call","begin","end","var","const", "if","then","while","do","read","write","odd", "program","type","function","array","integer", };//單字運(yùn)算符constcharopatxt[MAX_OPWORDA]={ '+','-','*','/','=','#','<','>'};//雙字運(yùn)算符constchar*constopbtxt[MAX_OPWORDB]={ "<=",">=",":=","<>"};//單字界符constchareoptxt[MAX_ENDWORD]={ '(',')',',',';','.','[',']',':'};//錯(cuò)誤提示信息constchar*consterrtxt[MAX_ERROR]={ "OK", //Notused. "Toolongsymbol", "Toolongnumber", "Mixednumberandletter", "Unkownoperator",};intgetsym(constchar*in,structSYM*out,int*ln,structFORM*form){ charb[MAX_BUFFER]; //建符號緩沖區(qū) inti,m=0,n=0,e=0; //序號/非字符數(shù)/字符數(shù)/出錯(cuò)標(biāo)記 memset(out,0,sizeof(structSYM)); while(!ISCHAR(*in)) //濾出前面的非字符 { if(*in==10)(*ln)++;//換行時(shí),ln++ if(*in++)m++;elsereturn0; //如果無字符則退出 } out->line=*ln; if(ISLETTER(*in)) //字母開頭情況 { while(ISLETTER(*in)||ISNUMBER(*in)) { if(n<=MAX_SYMLEN)b[n]=*in; { out->type=TYPE_ERROR; out->id=ERR_OVERSYMLEN; } else { for(i=0;i<MAX_KEYWORD;i++) if(strcmp(b,keytxt[i])==0)break; if(i<MAX_KEYWORD) //屬于關(guān)鍵字 { out->type=TYPE_KEYWORD; out->id=i; } else //不屬于關(guān)鍵字 { for(i=0;i<form->symnum;i++) if(strcmp(b,form->symf[i].name)==0)break; if(i==form->symnum) //不在符號表中則添加 { if(form->symnum>=MAX_SYMFORM) { //超出符號表范圍產(chǎn)生嚴(yán)重錯(cuò)誤 out->type=TYPE_ERROR; out->id=ERR_OVERSYMFORM; returnm+n; } form->symf[i].id=i; strcpy(form->symf[i].name,b); form->symnum++; } out->type=TYPE_SYMBOL; //符號類型 out->id=i; } } returnm+n; } if(ISNUMBER(*in)) //數(shù)字開頭情況 { e=0; } b[MAX_NUMLEN]=0; //數(shù)字尾置0 if(n<MAX_NUMLEN)b[n]=0; strcpy(out->name,b); if(e||n>MAX_NUMLEN) //有出錯(cuò)標(biāo)記或超出數(shù)字最大長度 { out->type=TYPE_ERROR; if(e) //含字母情況 out->id=ERR_NUMBER; else //超出數(shù)字最大長度情況 out->id=ERR_OVERNUMLEN; } else //無錯(cuò)情況 { if(form->numnum>=MAX_NUMFORM) { //超出常量表范圍產(chǎn)生嚴(yán)重錯(cuò)誤 out->type=TYPE_ERROR; out->id=ERR_OVERNUMFORM; returnm+n; } form->numf[form->numnum].id=form->numnum; strcpy(form->numf[form->numnum].name,b); out->type=TYPE_NUMBER; out->id=form->numnum; form->numnum++; } returnm+n; } for(i=0;i<MAX_OPWORDB;i++) //雙字運(yùn)算符情況 if(*(short*)in==*(short*)(opbtxt[i]))break; if(i<MAX_OPWORDB) { out->type=TYPE_OPWORD; out->id=MAX_OPWORDA+i; *(short*)out->name=*(short*)opbtxt[i]; out->name[2]=0; returnm+2; } { out->type=TYPE_OPWORD; out->id=i; returnm+1; } for(i=0;i<MAX_ENDWORD;i++) //單字界符情況 if(*in==eoptxt[i])break; if(i<MAX_ENDWORD) { out->type=TYPE_ENDWORD; out->id=i; returnm+1; } out->type=TYPE_ERROR; out->id=ERR_WRONGOP; //其他符號則出錯(cuò) returnm+1;}intgetsyminfo(constchar*in,structSYMINFO*out){ intoffset,ln=1; //每次取詞偏移量/當(dāng)前行數(shù) memset(out,0,sizeof(structSYMINFO)); while(1) { offset=getsym(in,&out->sym[out->num],&ln,&out->form); if(offset==0)break; //完成取詞則退出 if(out->num>=MAX_SYM)returnERR_OVERSYMNUM;//超出符號信息最大值 if(out->sym[out->num].type==TYPE_ERROR&&out->sym[out->num].id>=10000) returnout->sym[out->num].id;//有嚴(yán)重錯(cuò)誤則退出 out->num++; in+=offset; } return0;}Test.Txtprogramtest;procedurefunc(a:integer,b:char);begin varc:char; end;begin consts:=4444; a:=b[333]; whiles=ado begin calltest; end; write(a);end.結(jié)果實(shí)驗(yàn)二LL(1)語法分析程序設(shè)計(jì)【實(shí)驗(yàn)?zāi)康摹?.熟悉判斷LL(1)文法的方法及對某一輸入串的分析過程。2.學(xué)會構(gòu)造表達(dá)式文法的預(yù)測分析表。【實(shí)驗(yàn)內(nèi)容】編寫一個(gè)語法分析程序,對于給定的輸入串,能夠判斷識別該串是否為給定文法的句型。【實(shí)驗(yàn)步驟和要求】從鍵盤讀入輸入串,并判斷正誤;若無誤,由程序自動構(gòu)造FIRST、FOLLOW集以及SELECT集合,判斷是否為LL(1)文法;若符合LL(1)文法,由程序自動構(gòu)造LL(1)分析表;由算法判斷輸入符號串是否為該文法的句型。(可參考教材96頁的例題1)【源代碼】#include"stdio.h"
#include"stdlib.h"#defineMaxRuleNum8
#defineMaxVnNum5
#defineMaxVtNum5
#defineMaxStackDepth20
#defineMaxPLength20
#defineMaxStLength50
structpRNode/*產(chǎn)生式右部結(jié)構(gòu)*/
{intrCursor;/*右部序號*/structpRNode*next;
};structpNode/*產(chǎn)生式結(jié)點(diǎn)結(jié)構(gòu)*/
{intlCursor;/*左部符號序號*/intrLength;/*右部長度*//*注當(dāng)rLength=1時(shí),rCursor=-1為空產(chǎn)生式*/structpRNode*rHead;/*右部結(jié)點(diǎn)頭指針*/
};
intPNum;/*產(chǎn)生式實(shí)際個(gè)數(shù)*/
charbuffer[MaxPLength+1];
charch;/*符號或stringch;*/
charst[MaxStLength];/*要分析的符號串*/structcollectNode/*集合元素結(jié)點(diǎn)結(jié)構(gòu)*/
{intnVt;/*在終結(jié)符集中的下標(biāo)*/structcollectNode*next;
};structcollectNode*first[MaxVnNum+1];/*first集*/
structcollectNode*follow[MaxVnNum+1];/*follow集*/intanalyseTable[MaxVnNum+1][MaxVtNum+1+1];
/*預(yù)測分析表存放為產(chǎn)生式的編號,+1用于存放結(jié)束符,多+1用于存放#(-1)*/intanalyseStack[MaxStackDepth+1];/*分析棧*/
inttopAnalyse;/*分析棧頂*/
/*intreverseStack[MaxStackDepth+1];/*顛倒順序棧*/
/*inttopReverse;/*倒敘棧頂*/
voidInit();/*初始化*/
intIndexCh(charch);
/*返回Vn在Vn表中的位置+100、Vt在Vt表中的位置,-1表示未找到*/
voidInputVt();/*輸入終結(jié)符*/
voidInputVn();/*輸入非終結(jié)符*/
voidShowChArray(char*collect,intnum);/*輸出Vn或Vt的內(nèi)容*/
voidInputP();/*產(chǎn)生式輸入*/
boolCheckP(char*st);/*判斷產(chǎn)生式正確性*/
voidFirst(intU);/*計(jì)算first集,U->xx...*/
voidAddFirst(intU,intnCh);/*加入first集*/
boolHaveEmpty(intnVn);/*判斷first集中是否有空(-1)*/
voidFollow(intV);/*計(jì)算follow集*/
voidAddFollow(intV,intnCh,intkind);/*加入follow集,kind=0表加入follow集,kind=1加入first集*/
voidShowCollect(structcollectNode**collect);/*輸出first或follow集*/
voidFirstFollow();/*計(jì)算first和follow*/
voidCreateAT();/*構(gòu)造預(yù)測分析表*/
voidShowAT();/*輸出分析表*/
voidIdentify(char*st);/*主控程序,為操作方便*/
/*分析過程顯示操作為本行變換所用,與教程的顯示方式不同*/
voidInitStack();/*初始化棧及符號串*/
voidShowStack();/*顯示符號棧中內(nèi)容*/
voidPop();/*棧頂出棧*/
getchar();FirstFollow();printf("所得first集為:");ShowCollect(first);printf("所得follow集為:");ShowCollect(follow);CreateAT();ShowAT();todo='y';while('y'==todo){printf("\n是否繼續(xù)進(jìn)行句型分析?(y/n):");todo=getchar();while('y'!=todo&&'n'!=todo){printf("\n(y/n)?");todo=getchar();}if('y'==todo){inti;InitStack();printf("請輸入符號串(以#結(jié)束):");ch=getchar();i=0;while('#'!=ch&&i<MaxStLength){if(''!=ch&&'\n'!=ch){st[i++]=ch;}ch=getchar();}if('#'==ch&&i<MaxStLength){st[i]=ch;Identify(st);}elseprintf("輸入出錯(cuò)!\n");}}getchar();
}
voidInit()
{inti,j;vnNum=0;vtNum=0;PNum=0;for(i=0;i<=MaxVnNum;i++)Vn[i]='\0';for(i=0;i<=MaxVtNum;i++)Vt[i]='\0';for(i=0;i<MaxRuleNum;i++){P[i].lCursor=NULL;P[i].rHead=NULL;P[i].rLength=0;}PNum=0;for(i=0;i<=MaxPLength;i++)buffer[i]='\0';for(i=0;i<MaxVnNum;i++){first[i]=NULL;follow[i]=NULL;}for(i=0;i<=MaxVnNum;i++){for(j=0;j<=MaxVnNum+1;j++)analyseTable[i][j]=-1;}
}
/*返回Vn在Vn表中的位置+100、Vt在Vt表中的位置,-1表示未找到*/
intIndexCh(charch)
{intn;n=0;/*isVn?*/while(ch!=Vn[n]&&'\0'!=Vn[n])n++;if('\0'!=Vn[n])return100+n;n=0;/*isVt?*/while(ch!=Vt[n]&&'\0'!=Vt[n])n++;if('\0'!=Vt[n])returnn;return-1;
}
/*輸出Vn或Vt的內(nèi)容*/
voidShowChArray(char*collect)
{intk=0;while('\0'!=collect[k]){printf("%c",collect[k++]);}printf("\n");
}
/*輸入非終結(jié)符*/
voidInputVn()
{intinErr=1;intn,k;charch;while(inErr){printf("\n請輸入所有的非終結(jié)符,注意:");printf("請將開始符放在第一位,并以#號結(jié)束:\n");ch='';n=0;/*初始化數(shù)組*/while(n<MaxVnNum){Vn[n++]='\0';}n=0;while(('#'!=ch)&&(n<MaxVnNum)){if(''!=ch&&'\n'!=ch&&-1==IndexCh(ch)){Vn[n++]=ch;vnNum++;}ch=getchar();}Vn[n]='#';/*以“#”標(biāo)志結(jié)束用于判斷長度是否合法*/k=n;/*k用于記
}
/*輸入終結(jié)符*/
voidInputVt()
{intinErr=1;intn,k;charch;while(inErr){printf("\n請輸入所有的終結(jié)符,注意:");printf("以#號結(jié)束:\n");ch='';n=0;/*初始化數(shù)組*/while(n<MaxVtNum){Vt[n++]='\0';}n=0;while(('#'!=ch)&&(n<MaxVtNum)){if(''!=ch&&'\n'!=ch&&-1==IndexCh(ch)){Vt[n++]=ch;vtNum++;}ch=getchar();}Vt[n]='#';/*以“#”標(biāo)志結(jié)束*/k=n;/*k用于記錄n以便改Vt[n]='\0'*/if('#'!=ch){if('#'!=(ch=getchar())){while('#'!=(ch=getchar()))printf("\n符號數(shù)目超過限制!\n");inErr=1;continue;}}/*正確性確認(rèn),正確則,執(zhí)行下下面,否則重新輸入*/Vt[k]='\0';ShowChArray(Vt);ch='';while('y'!=ch&&'n'!=ch){if('\n'!=ch){printf("輸入正確確認(rèn)?(y/n):");}scanf("%c",&ch);}if('n'==ch){printf("錄入錯(cuò)誤重新輸入!\n");inErr=1;}else{inErr=0;}}
}
/*產(chǎn)生式輸入*/
voidInputP()
{charch;inti=0,n,num;printf("請輸入文法產(chǎn)生式的個(gè)數(shù):");scanf("%d",&num);PNum=num;getchar();/*消除回車符*/printf("\n請輸入文法的%d個(gè)產(chǎn)生式,并以回車分隔每個(gè)產(chǎn)生式:",num);printf("\n");while(i<num){printf("第%d個(gè):",i);/*初始化*/for(n=0;n<MaxPLength;n++)buffer[n]='\0';/*輸入產(chǎn)生式串*/ch='';n=0;while('\n'!=(ch=getchar())&&n<MaxPLength){if(''!=ch)buffer[n++]=ch;}buffer[n]='\0';
/*printf("%s",buffer);*/if(CheckP(buffer)){/*填寫入產(chǎn)生式結(jié)構(gòu)體*/pRNode*pt,*qt;P[i].lCursor=IndexCh(buffer[0]);pt=(pRNode*)malloc(sizeof(pRNode));pt->rCursor=IndexCh(buffer[3]);pt->next=NULL;P[i].rHead=pt;n=4;while('\0'!=buffer[n]){qt=(pRNode*)malloc(sizeof(pRNode));qt->rCursor=IndexCh(buffer[n]);qt->next=NULL;pt->next=qt;pt=qt;n++;}P[i].rLength=n-3;i++;/*調(diào)試時(shí)使用*/}elseprintf("輸入符號含非法在成分,請重新輸入!\n");}
}
/*判斷產(chǎn)生式正確性*/
boolCheckP(char*st)
{intn;if(100>IndexCh(st[0]))returnfalse;if('-'!=st[1])returnfalse;if('>'!=st[2])returnfalse;for(n=3;'\0'!=st[n];n++){if(-1==IndexCh(st[n]))returnfalse;}returntrue;
}
/*====================first&follow======================*/
/*計(jì)算first集,U->xx...*/
}
/*加入first集*/
voidAddFirst(intU,intnCh)/*當(dāng)數(shù)值小于100時(shí)nCh為Vt*/
/*當(dāng)處理非終結(jié)符時(shí),AddFirst不添加空項(xiàng)(-1)*/
{structcollectNode*pt,*qt;intch;/*用于處理Vn*/pt=NULL;qt=NULL;if(nCh<100){pt=first[U-100];while(NULL!=pt){if(pt->nVt==nCh)break;else{qt=pt;pt=pt->next;}}if(NULL==pt){pt=(structcollectNode*)malloc(sizeof(structcollectNode));pt->nVt=nCh;pt->next=NULL;if(NULL==first[U-100]){first[U-100]=pt;}else{qt->next=pt;/*qt指向first集的最后一個(gè)元素*/}pt=pt->next;}}else{pt=first[nCh-100];while(NULL!=pt){ch=pt->nVt;if(-1!=ch){AddFirst(U,ch);}pt=pt->next;}}
}
/*判斷first集中是否有空(-1)*/boolHaveEmpty(intnVn)
{if(nVn<100)/*為終結(jié)符時(shí)(含-1),在follow集中用到*/returnfalse;structcollectNode*pt;pt=first[nVn-100];while(NULL!=pt){if(-1==pt->nVt)returntrue;pt=pt->next;}returnfalse;
}
/*計(jì)算follow集,例:U->xVy,U->xV.(注:初始符必含#——"-1")*/
voidFollow(intV)
{inti;structpRNode*pt;if(100==V)/*當(dāng)為初始符時(shí)*/AddFollow(V,-1,0);for(i=0;i<PNum;i++){pt=P[i].rHead;while(NULL!=pt&&pt->rCursor!=V)/*注此不能處理:U->xVyVz的情況*/pt=pt->next;if(NULL!=pt){pt=pt->next;/*V右側(cè)的符號*/if(NULL==pt)/*當(dāng)V后為空時(shí)V->xV,將左符的follow集并入V的follow集中*/{if(NULL==follow[P[i].lCursor-100]&&P[i].lCursor!=V){Follow(P[i].lCursor);}AddFollow(V,P[i].lCursor,0);}else/*不為空時(shí)V->xVy,(注意:y->),調(diào)用AddFollow加入Vt或y的first集*/{while(NULL!=pt&&HaveEmpty(pt->rCursor)){AddFollow(V,pt->rCursor,1);/*y的前綴中有空時(shí),加如first集*/pt=pt->next;}if(NULL==pt)/*當(dāng)后面的字符可以推出空時(shí)*/{if(NULL==follow[P[i].lCursor-100]&&P[i].lCursor!=V){Follow(P[i].lCursor);}AddFollow(V,P[i].lCursor,0);}else/*發(fā)現(xiàn)不為空的字符時(shí)*/{AddFollow(V,pt->rCursor,1);}}}}
}/*當(dāng)數(shù)值小于100時(shí)nCh為Vt*/
/*#用-1表示,kind用于區(qū)分是并入符號的first集,還是follow集
kind=0表加入follow集,kind=1加入first集*/
}
/*輸出first或follow集*/
voidShowCollect(structcollectNode**collect)
{inti;structcollectNode*pt;i=0;while(NULL!=collect[i]){pt=collect[i];printf("\n%c:\t",Vn[i]);while(NULL!=pt){if(-1!=pt->nVt){printf("%c",Vt[pt->nVt]);}elseprintf("#");pt=pt->next;}i++;}printf("\n");
}
/*計(jì)算first和follow*/
voidFirstFollow()
{inti;i=0;while('\0'!=Vn[i]){if(NULL==first[i])First(100+i);i++;}i=0;while('\0'!=Vn[i]){if(NULL==follow[i])Follow(100+i);i++;}
}
/*=================構(gòu)造預(yù)測分析表,例:U::xyz=============*/
voidCreateAT()
{inti;structpRNode*pt;structcollectNode*ct;for(i=0;i<PNum;i++){pt=P[i].rHead;while(NULL!=pt&&HaveEmpty(pt->rCursor)){/*處理非終結(jié)符,當(dāng)為終結(jié)符時(shí),定含空為假跳出*/ct=first[pt->rCursor-100];while(NULL!=ct){if(-1!=ct->nVt)analyseTable[P[i].lCursor-100][ct->nVt]=i;ct=ct->next;}pt=pt->next;}if(NULL==pt){/*NULL==pt,說明xyz->,用到follow中的符號*/ct=follow[P[i].lCursor-100];while(NULL!=ct){if(-1!=ct->nVt)analyseTable[P[i].lCursor-100][ct->nVt]=i;else/*當(dāng)含有#號時(shí)*/analyseTable[P[i].lCursor-100][vtNum]=i;ct=ct->next;}}else{if(100<=pt->rCursor)/*不含空的非終結(jié)符*/{ct=first[pt->rCursor-100];while(NULL!=ct){analyseTable[P[i].lCursor-100][ct->nVt]=i;ct=ct->next;}}else/*終結(jié)符或者空*/{if(-1==pt->rCursor)/*-1為空產(chǎn)生式時(shí)*/{ct=follow[P[i].lCursor-100];while(NULL!=ct){if(-1!=ct->nVt)analyseTable[P[i].lCursor-100][ct->nVt]=i;else/*當(dāng)含有#號時(shí)*/analyseTable[P[i].lCursor-100][vtNum]=i;ct=ct->next;}}else/*為終結(jié)符*/{analyseTable[P[i].lCursor-100][pt->rCursor]=i;}}}}
}
/*輸出分析表*/
voidShowAT()
{inti,j;analyseTable[i][j]);elseprintf("error\t");}printf("\n");}
}/*=================主控程序=====================*/
voidIdentify(char*st)
{intcurrent,step,r;/*r表使用的產(chǎn)生式的序號*/printf("\n%s的分析過程:\n",st);printf("步驟\t分析符號棧\t當(dāng)前指示字符\t使用產(chǎn)生式序號\n");step=0;current=0;/*符號串指示器*/printf("%d\t",step);ShowStack();printf("\t\t%c\t\t--\n",st[current]);while('#'!=st[current]){if(100>analyseStack[topAnalyse])/*當(dāng)為終結(jié)符時(shí)*/{if(analyseStack[topAnalyse]==IndexCh(st[current])){/*匹配出棧,指示器后移*/Pop();current++;step++;printf("%d\t",step);ShowStack();printf("\t\t%c\t\t出棧、后移\n",st[cur
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2022年上海統(tǒng)計(jì)師(初級)考試題庫(含基礎(chǔ)和實(shí)務(wù))
- 甘孜職業(yè)學(xué)院《工程機(jī)械設(shè)計(jì)》2023-2024學(xué)年第一學(xué)期期末試卷
- 七年級科學(xué)上冊11.1生物的感覺11.1.1生物對環(huán)境變化的反應(yīng)學(xué)案無答案牛津上海版
- 三年級數(shù)學(xué)上冊6平移旋轉(zhuǎn)和軸對稱單元概述和課時(shí)安排素材蘇教版
- 三年級數(shù)學(xué)上冊四乘與除教案北師大版
- 三年級科學(xué)上冊第三單元人與動物5動物世界第一課時(shí)教案首師大版
- 三年級科學(xué)下冊第四單元磁鐵第3課磁鐵的兩極教學(xué)材料教科版
- 計(jì)量設(shè)備培訓(xùn)課件
- 《米拉公寓建筑分析》課件
- 《弧形導(dǎo)臺過站》課件
- 蜜雪冰城合同范例
- 小紅書種草營銷師(初級)認(rèn)證考試真題試題庫(含答案)
- LPG液化氣充裝站介質(zhì)分析操作規(guī)程 202412
- 養(yǎng)老院環(huán)境衛(wèi)生保潔方案
- 中學(xué)學(xué)校裝修改造工程施工組織設(shè)計(jì)方案
- 2024年5G網(wǎng)絡(luò)覆蓋工程分包合同
- 2025屆北京市海淀區(qū)交大附中高一物理第一學(xué)期期末復(fù)習(xí)檢測試題含解析
- 天津市武清區(qū)2024-2025學(xué)年九年級上學(xué)期11月期中物理試題(無答案)
- 煤礦防治水細(xì)則解讀
- 2023屆安徽省馬鞍山市高三第一次教學(xué)質(zhì)量監(jiān)測(一模)理綜生物試題(原卷版)
- 充電樁租賃協(xié)議模板
評論
0/150
提交評論