版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
編譯原理課程設(shè)計(jì)關(guān)于DO-WHILE語句的語法分析程序設(shè)計(jì)09計(jì)科一班吳龍2009221104210014PAGEPAGE1編譯原理課程設(shè)計(jì)關(guān)于DO-WHILE語句的語法分析程序設(shè)計(jì)09計(jì)科一班吳龍2009221104210014目錄摘要………………1一、問題的重述………………2二、問題的背景………………2三、名詞解釋以及一些基本概念…………2四、文法及屬性文法的描述…………………3五、語法分析方法及中間代碼形式的描述……………35.1語法分析方法描述………35.1.1簡單優(yōu)先法的基本思想………………35.1.2簡單優(yōu)先基本分析思路框圖…………5.1.3中間代碼形式描述……………………5.2簡單的分析與概要設(shè)計(jì)…………………55.3詳細(xì)的算法描述…………55.4Global的主要算法………65.5Parse的主要算法………65.6Prece的主要算法………85.7 Stack的主要算法………9六、軟件的測試方法和測試結(jié)果…………10七、設(shè)計(jì)的特點(diǎn),不足,收獲與體會………11八、參考文獻(xiàn):…………………12九、附錄:…………13Parse.h……………………13Prece.h……………………15Stack.h……………………17Global.h……………………19Main.c……………………19關(guān)于DO-WHILE語句的語法分析程序設(shè)計(jì)摘要用高級語言程序設(shè)計(jì)的語言(簡稱高級語言)編寫的程序方便,效率高,但是計(jì)算機(jī)不能直接執(zhí)行用高級語言編寫的程序,只能直接執(zhí)行機(jī)器語言程序,因此用高級語言編寫的程序必須有一個(gè)翻譯程序翻譯成機(jī)器語言程序?,F(xiàn)在計(jì)算機(jī)系統(tǒng)一般都含有不只一個(gè)的高級語言的編譯程序。高級語言編譯程序是計(jì)算機(jī)系統(tǒng)軟件最主要的組成部分之一,也是用戶最直接關(guān)系的工具之一。計(jì)算機(jī)上執(zhí)行一個(gè)高級語言程序一般分為兩步:第一,用一個(gè)編譯程序把高級語言翻譯成機(jī)器語言程序;第二,運(yùn)行所得的機(jī)器語言程序求得計(jì)算結(jié)果。編譯程序各階段的任務(wù)包括:詞法分析器(必要);語法分析器(必要);語義分析與中間代碼生成器(可選);代碼優(yōu)化(可選);目標(biāo)代碼生成器(必要)。本程序的設(shè)計(jì)用于判斷do-while語句文法,涉及到編譯五個(gè)階段中的三個(gè),即詞法分析器、語法分析器、語義分析和中間代碼生成器。編譯程序的輸出結(jié)果包括詞法分析后的二元式序列、變量名表、及四元式序列程序。整個(gè)編譯程序分為四部分:詞法分析部分、語法分析處理及四元式生成部分、輸出顯示部分。語法分析使用的是至上而下的分析方法——簡單優(yōu)先分析方法,通過構(gòu)造Warshall算法,構(gòu)造關(guān)系first與last,進(jìn)而求出文法關(guān)系矩陣。最后由關(guān)系矩陣得出符號串的分析過程,最終判斷該符號串是否為此文法的一個(gè)句型。關(guān)鍵詞:至上而下的分析方法簡單優(yōu)先分析方法四元組Warshall算法關(guān)系矩陣一、問題的重述輸入一個(gè)DO-WHILE的語句,可以輸出判斷此語句是否為DO-WHILE該文法的一個(gè)句子。首先對這個(gè)語句進(jìn)行詞法分析,詞法分析器利用超前搜索,狀態(tài)轉(zhuǎn)換等方法,將源程序轉(zhuǎn)化成為一個(gè)一個(gè)的單詞符號二元式,如果詞法分析無誤,則進(jìn)入語法分析部分,使用簡單優(yōu)先法進(jìn)行文法分析,在每個(gè)終結(jié)符與非終極符之間定義優(yōu)先關(guān)系,利用優(yōu)先關(guān)系進(jìn)行移進(jìn)-規(guī)約,如果能規(guī)約到文法的開始符,則文法分析成功,輸出四元式.二、問題的背景用高級語言程序設(shè)計(jì)的語言(簡稱高級語言)編寫的程序方便,效率高,但是計(jì)算機(jī)不能直接執(zhí)行用高級語言編寫的程序,只能直接執(zhí)行機(jī)器語言程序,因此用高級語言編寫的程序必須有一個(gè)翻譯程序翻譯成機(jī)器語言程序。這個(gè)翻譯程序的執(zhí)行過程十分的復(fù)雜,其主要功能是將源程序翻譯成等價(jià)的目標(biāo)程序,一般標(biāo)準(zhǔn)的編譯程序可以分為詞法分析、語法分析、語義分析、中間代碼生成、中間代碼優(yōu)化和目標(biāo)代碼生成等階段來實(shí)現(xiàn)的。詞法分析:詞法分析是編譯過程的基礎(chǔ),其任務(wù)是掃描源程序。根據(jù)源程序的詞法規(guī)則,分解和識別出每一個(gè)單詞,并把單詞翻譯成相應(yīng)的機(jī)內(nèi)表示,當(dāng)然,詞法分析在標(biāo)識單詞的過程中,同時(shí)也做語法檢查。單詞是語言中最小的語義單位,如語言中的關(guān)鍵字、標(biāo)識符和常量等。語法分析:語法分析是在詞法分析的基礎(chǔ)上進(jìn)行的。語法分析的任務(wù)是根據(jù)語言的語法規(guī)則,把單詞符號串分解成各類的語法單詞,如表達(dá)式、語句等。通常語言分析、可以確定整個(gè)輸入符號串是否構(gòu)成一個(gè)語法正確的程序。語義分析:語義分析是對源程序進(jìn)行語義檢查,其目的是保證標(biāo)識符和常數(shù)的正確使用。中間代碼生成以及中間代碼優(yōu)化:對于編譯程序來說并不是必不可少的。目標(biāo)代碼生成:目標(biāo)代碼生成是編譯程序的最后階段。因此,本文就此也僅對編譯程序中循環(huán)語句DO-While的語法分析過程做一個(gè)設(shè)計(jì)——DO-WHILE語法分析器。三、名詞解釋以及一些基本概念名詞解釋及其概念1、自上而下的分析方法:它是一種移進(jìn)-規(guī)約方法。需要用到一個(gè)符號棧,檢查符號串的符號逐個(gè)被“移進(jìn)”S棧,當(dāng)棧頂符號串和某個(gè)產(chǎn)生式右部相匹配時(shí),這個(gè)符號串被替換成“規(guī)約”改產(chǎn)生式左部為非非終結(jié)符。2、簡單優(yōu)先分析方法:它是一種典型的自上而下的分析方法,它對符號串語法分析的過程,實(shí)際就是一個(gè)規(guī)約的過程。這個(gè)規(guī)約過程中,它根據(jù)文法符號之間的簡單優(yōu)先關(guān)系來尋找符號串中可進(jìn)行的子串,此子串稱為句柄。一個(gè)文法G,若它不含e產(chǎn)生式,也不含任何右部相同的不同產(chǎn)生式,并且它的任何符號對(X,Y),或者沒有關(guān)系,或者存在下述三種關(guān)系:=、<、>之一,則稱該文法是一個(gè)簡單優(yōu)先文法。A)X=Y當(dāng)且僅當(dāng)G中含有形如P?…XY…的產(chǎn)生式B)X<Y當(dāng)且僅當(dāng)G中含有形如P?…XQ…的產(chǎn)生式,其中Q為非終結(jié)符,且Q?Y...C)X>Y當(dāng)且僅當(dāng)Y為G的終結(jié)符,G中含有形如P?…QR…的產(chǎn)生式,其中Q,R為非終結(jié)符,且Q?…X,Y?First(R)D)對任何X,若文法開始符號S?X…,則#<X,若S?…X,則X>#。3.簡單優(yōu)先矩陣:用于表示文法符號之間的簡單優(yōu)先關(guān)系的矩陣。4.簡單優(yōu)先舉證的優(yōu)缺點(diǎn):優(yōu)點(diǎn):技術(shù)簡單缺點(diǎn):適用范圍小,分析表尺寸太大。四、文法及屬性文法的描述4.1文法描述4.2屬性文法描述G(s):S->doBwhileE,{S.begin:=newlabel;B.next:=S.begin;E.true:=newlabel;E.false:=S.next;S.code:=gen(S.begin’:’)‖B.code‖E.code‖gen(E.true’:’)‖gen(‘goto’S.begin)}B->c:=a+1{B.code:=’c:=a+1’}E->a>b{E.code=gen(‘if’’a>b’’goto’E.true)‖Gen(‘goto’E.false)}E->true{E.code:=gen(‘goto’E.true)}E->false{E.code:=gen(‘goto’E.false)}五、語法分析方法及中間代碼形式的描述5.1語法分析方法描述5.1.1簡單優(yōu)先法的根據(jù)優(yōu)先關(guān)系的定義,將簡單優(yōu)先文法中各文法符號之間的這種關(guān)系用一個(gè)矩陣表示,稱作簡單優(yōu)先矩陣。PDA讀入一個(gè)單詞后,比較棧頂符號和該單詞的優(yōu)先級,若棧頂符號優(yōu)先級低于該單詞,繼續(xù)讀入;若棧頂符號優(yōu)先級高于或等于讀入符號,則找句柄進(jìn)行歸約,找不到句柄就繼續(xù)讀入。直到最后棧內(nèi)只剩下開始符號,輸入串讀到“?!睘橹?。此時(shí)識別正確。可分點(diǎn)描述如下:1、對句型中相鄰的文法符號規(guī)定優(yōu)先關(guān)系,以尋找句型中的句柄;2、規(guī)定句柄內(nèi)各相鄰符號之間具有相同的優(yōu)先級;3、規(guī)定句柄兩端符號優(yōu)先級要比位于句柄之外而又和句柄相鄰的符號的優(yōu)先級高,以先歸約句柄;4、對于文法中所有符號,只要它們可能在某個(gè)句型中相鄰,就要為它們規(guī)定相應(yīng)的優(yōu)先關(guān)系,若某兩個(gè)符號永遠(yuǎn)不可能相鄰,則它們之間就無關(guān)系.5.1.2簡單優(yōu)先SS[1]<-#,i,j<-1M[S[i],TR[j]]=error?開始結(jié)束S[i]>TR[j]?K<-iS[k-1]<s[k]?a=S[k]S[K+1]…S[i]a是句柄,用它來查產(chǎn)生式表a與一產(chǎn)生式右部相同?S[i]=#且TR[j]=#?errori<-kS[i]<-UU是該產(chǎn)生式左部符號K<-k-1errori<-i+1S[i]<-TR[i]j<j+1YNYNYYNYNN如上圖是一個(gè)簡單優(yōu)先算法框圖。算法中,用到了一個(gè)符號棧S,棧頂指針為i,輸入符號串放在數(shù)字符號組TR中,j是下標(biāo)。令#<TR[j],S[i]>#.在尋找句型的句柄時(shí),總是先找到句柄的尾符號,然后再向前搜索器首符號。如果S[i]>TR[j],則此S[i]為句柄尾符號,句柄尾符號找到之后,再往前比較兩個(gè)相鄰的符號,如果S[k-1]<S[k],則此S[k]便是句柄之首符號。無論是比較S[i]與TR[j],還是比較S[k-1]與S[k],它們的一句都是文法簡答優(yōu)先關(guān)系矩陣。找到了句柄,就可以用它去查文法的產(chǎn)生式表,如果有某一個(gè)產(chǎn)生式的右部和句柄相匹配,則用改產(chǎn)生式的左部符號(一個(gè)非終結(jié)符)去替換符號棧中的這個(gè)句柄。最后,如果S[i]為文法標(biāo)識符,而TR[j]為“#”號,則表示輸入的符號串是文法的一個(gè)句子,算法終止,否則,輸入符號串不是文法的一個(gè)句子。5.1.3四元式是一種比較普遍采用的中間代碼形式。四元式的四個(gè)組成成分是:算符op,第一和第二運(yùn)算對象ARG1和ARG2及運(yùn)算結(jié)果RESULT。運(yùn)算對象和運(yùn)算結(jié)果有時(shí)指用戶自己定義的變量,有時(shí)指編譯程序引進(jìn)的臨時(shí)變量。例如:輸入字符串doc=a+1whilea>b則輸出四元式(1)(+,a,1,c)(2)(>,a,b,t0)(3)(=,t0,true,1)(4)(-,-,-,-)5.2簡單的分析與概要設(shè)計(jì)整個(gè)工程分為5個(gè)文件:Main.c程序的入口點(diǎn),輸入待分析的字符串后先進(jìn)行詞法分析,然后調(diào)用兩個(gè)函數(shù)進(jìn)行語法分析及產(chǎn)生中間代碼。Global.h定義了一些全局變量及宏P(guān)arse.h語法分析器的主要算法Prece.h定義和實(shí)現(xiàn)了一些關(guān)于優(yōu)先級的操作Stack.h定義和實(shí)現(xiàn)了一個(gè)棧及其操作5.3詳細(xì)的算法描述voidInputString()//輸入字符串{intlen=0; printf("表達(dá)式文法為:");printf(GRAMMAR);printf("\nPleaseinputanystringtoparse:\n");scanf("%s",Buff);//輸入字符串len=strlen(Buff);//取字符串長度Buff[len]='#';Buff[len+1]=0;}voidmain()//主程序{printf("DO-WHILE循環(huán)語句的翻譯\n");printf("循環(huán)語句的格式為:DO<賦值語句>WHILE<表達(dá)式>\n");printf("翻譯的語句:doc=a+1whilea>b\n"); cifa();//調(diào)用詞法分析程序,對輸入字符串進(jìn)行詞法分析 InputString();//再次輸入待分析字符串以便進(jìn)行語法分析Parse();//調(diào)用語法分析,對輸入字符串進(jìn)行語法分析getch();}voidcifa()//詞法分析{charstr;printf("**********詞法分析器**********\n");if((fp=fopen("lj.txt","r"))==NULL)//如果文件無法打開printf("源程序無法打開!\n");else{str=fgetc(fp);while(str!=EOF){if(isalpha(str)!=0)//判斷是否為字符str=letterprocess(str);//調(diào)用字符處理else{if(isdigit(str)!=0)判斷是否為數(shù)字str=numberprocess(str);//調(diào)用數(shù)字處理else//其它str=otherprocess(str);//調(diào)用其它處理} };printf("詞法分析結(jié)束!\n");}}5.4Global的主要算法typedefenum{false=0,true}bool;#defineGRAMMAR"G(s):S->doBwhileE,B->c:=a+1,E=a>b"http://定義文法#defineBUFFSIZE100#defineSTACKSIZE1005.5Parse的主要算法voiderror()//規(guī)約不成功{printf("Theinputstringdoesn'tmatchthegrammar!");}voidsucceed()//規(guī)約成功{printf("Succeed!Theinputmatchthegrammar.");}charReduce(constchar*c)//將終極符或非終極符規(guī)約為非終極符{if(*c=='d'){return'S';}elseif(*c=='c'){return'B';}elseif(*c=='a'){return'E';}}boolParse()//簡單優(yōu)先語法分析{charc;//保存棧頂元素chart;//保存最有可能彈出的終極符intip=0;//指向輸入緩沖區(qū)的指針I(yè)nitStack();//初始化棧while(true){TopValue(&c);if(c=='S'&&Buff[ip]=='#')//如果棧頂為S或#,規(guī)約成功{succeed();returntrue;}else{switch(GetPrecedence(&c,&Buff[ip])){//如果優(yōu)先符是小于或等于則壓棧,否則進(jìn)棧caseLT:caseEQ:{Push(&Buff[ip++]);//壓棧 PrintStack();break;}caseGT:{Pop(&c);//出棧do{t=c;Pop(&c);}while(GetPrecedence(&c,&t)!=LT);Push(&c);t=Reduce(&t);Push(&t); PrintStack();break;}default:{error();returnfalse;}}}}}5.6Prece的主要算法//定義優(yōu)先關(guān)系PrecePreTable[18][18]={/**SdoBwhileEa=+1>bc#**//*S*/{NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,GT},/*d*/{NO,NO,EQ,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,GT},/*o*/{NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,LT,GT},/*B*/{NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,GT},/*w*/{NO,NO,NO,NO,NO,EQ,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,GT},/*h*/{NO,NO,NO,NO,NO,NO,EQ,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,GT},/*i*/{NO,NO,NO,NO,NO,NO,NO,EQ,NO,NO,NO,NO,NO,NO,NO,NO,NO,GT},/*l*/{NO,NO,NO,NO,NO,NO,NO,NO,EQ,NO,NO,NO,NO,NO,NO,NO,NO,GT},/*e*/{NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,LT,NO,NO,NO,NO,NO,NO,GT},/*E*/{NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,GT},/*a*/{NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,EQ,NO,NO,EQ,NO,GT},/*=*/{NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,EQ,NO,NO,NO,NO,NO,NO,GT},/*+*/{NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,EQ,NO,NO,NO,GT},/*1*/{NO,NO,NO,NO,NO,GT,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,GT},/*>*/{NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,EQ,NO,GT},/*b*/{NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,GT},/*c*/{NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,EQ,NO,NO,NO,NO,NO,GT},/*#*/{LT,LT,LT,LT,LT,LT,LT,LT,LT,LT,LT,LT,LT,LT,LT,LT,LT,EQ},};intCharToIndex(constchar*c)//定義矩陣{ switch(*c) { case'S':return0; case'd':return1; case'o':return2; case'B':return3; case'w':return4; case'h':return5; case'i':return6; case'l':return7; case'e':return8; case'E':return9; case'a':return10; case'=':return11; case'+':return12;case'1':return13;case'>':return14; case'b':return15; case'c':return16; case'#':return17; default:return-1; }}PreceGetPrecedence(constchar*c1,constchar*c2)//取優(yōu)先關(guān)系{inti,j; i=CharToIndex(c1);//棧頂元素 j=CharToIndex(c2); //輸入符號流第一個(gè)元素 if(i!=-1&&j!=-1) {returnPreTable[i][j];} else {returnND; //否則沒有優(yōu)先關(guān)系}}5.7 Stack的主要算法voidInitStack()//初始化符號棧{charc='#'; StackTop=0; Push(&c);}boolPush(constchar*c)//壓棧{if(StackTop<STACKSIZE){TheStack[StackTop++]=*c;returntrue;}else{returnfalse;}}boolPop(char*c)//出棧{if(StackTop>=0){*c=TheStack[--StackTop];returntrue;}else{returnfalse;}}boolTopValue(char*c)//取棧頂元素值{if(StackTop>0) /*notnull*/ {*c=TheStack[StackTop-1]; returntrue;} else {returnfalse;}}voidPrintStack()//打印棧的元素{inti; for(i=0;i<StackTop;i++) {printf("%c",TheStack[i]);} printf("\n");}六、軟件的測試方法和測試結(jié)果6.1測試方法在visualc++6.0下調(diào)試并通過.6.1測試方法七、設(shè)計(jì)的特點(diǎn),不足,收獲與體會這次編譯原理課程設(shè)計(jì)的題目是用簡單優(yōu)先分析法進(jìn)行DO-WHILE循環(huán)語句的語法分析,并輸出四元式.設(shè)計(jì)的特點(diǎn)是利用定義每個(gè)終極符和非終極符之間優(yōu)先關(guān)系,來進(jìn)行符號的移進(jìn)與規(guī)約,如果棧頂符號優(yōu)先級低于該單詞,繼續(xù)讀入;若棧頂符號優(yōu)先級高于或等于讀入符號,則找句柄進(jìn)行歸約,找不到句柄就繼續(xù)讀入。這樣使得程序簡化,只需定義一個(gè)棧用來存放移進(jìn)的字符,然后用棧頂指針指向它后與待移進(jìn)字符比較優(yōu)先級即可,設(shè)計(jì)簡單.此設(shè)計(jì)的嚴(yán)重不足是只能進(jìn)行一個(gè)固定句子的詞法與語法分析,因?yàn)樵诙x優(yōu)先關(guān)系時(shí)已固定了DO,和WHILE的每個(gè)字符之間的優(yōu)先關(guān)系,且賦值表達(dá)式和條件式也已固定,所以只能進(jìn)行本程序已約定好的語句.最大的收獲是在提出一個(gè)難題以后,如果能比較順手的解決的話,那是一件比較開心的事。只是有些時(shí)候越想問題就會越多,也越難解決,那就得慢慢調(diào)試,慢慢推導(dǎo)了。相信只要想得出,就能調(diào)得出,當(dāng)然耐心是很重要的,花在上面的時(shí)間也是要多一點(diǎn)的。完成此次課程設(shè)計(jì)以后,覺得自己在編譯原理的學(xué)習(xí)中存在很多的不足和需要提高的地方.通過對簡單優(yōu)先法翻譯程序的編程也使自己在編寫編譯程序上有了感官的認(rèn)識,且能力也得到了一定的提高!雖然此程序還存在很多的缺點(diǎn)與不足,但在將來的學(xué)習(xí)中我會不斷的完善此部分知識.獨(dú)立的完成程序以后也有不少收獲,為自己在以后的學(xué)習(xí)中做了很好的鋪墊!參考文獻(xiàn):[1]何炎祥《編譯原理》,華中科技大學(xué)出版社,2009年2月。[2]張素琴、呂映芝、蔣維杜、戴桂蘭等.編譯原理(第二版).清華大學(xué)出版社.2005[3]閔聯(lián)營、何克右.C++程序設(shè)計(jì)教程.武漢理工大學(xué)出版社.2005[4]StanleyB.Lippman、JoseeLajoie、BarbaraE.Moo著,李師賢、蔣愛軍、梅曉勇、林瑛譯.C++Primer中文版.2006附錄:Parse.h#ifndefPARSE_H#definePARSE_H#include"Global.h"#include"Stack.h"#include"Prece.h"/*Printtheerrormessage*/voiderror(){printf("Theinputstringdoesn'tmatchthegrammar!");}voidsucceed(){printf("Succeed!Theinputmatchthegrammar.");}/*Reduceterminalsornonterminalstoanonterminals*/charReduce(constchar*c){if(*c=='d'){return'S';}elseif(*c=='c'){return'B';}elseif(*c=='a'){return'E';}}/*thecorealgorithmofthisproject*/boolParse(){charc;/*Storethetopterminalofthestack*/chart;/*Storethemostrecentlypoppedterminal*/intip=0;/*Theindexpointingtotheinputbuffer*/InitStack();while(true){TopValue(&c);if(c=='S'&&Buff[ip]=='#'){ succeed();returntrue;}else{switch(GetPrecedence(&c,&Buff[ip])){caseLT:caseEQ:{Push(&Buff[ip++]); PrintStack();break;}caseGT:{ Pop(&c);do{t=c;Pop(&c); }while(GetPrecedence(&c,&t)!=LT);Push(&c);t=Reduce(&t);Push(&t); PrintStack();break;}default:{error();returnfalse;}}}}}#endif/*******************************************************************/Prece.h#ifndefPRECEDENCE_H#definePRECEDENCE_H#include"Global.h"#include"stdio.h"/* NO = Nonerelation GT=GreaterThan LT = LessThan EQ = Equalto ND = NotDefined */typedefenum{NO=0,GT,LT,EQ,/*Precedencetableoperates */PreceGetPrecedence(constchar*,constchar*);/*thePrecedencesTable */PrecePreTable[18][18]={/**SdoBwhileEa=+1>bc#**//*S*/{NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,GT},/*d*/{NO,NO,EQ,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,GT},/*o*/{NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,LT,GT},/*B*/{NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,GT},/*w*/{NO,NO,NO,NO,NO,EQ,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,GT},/*h*/{NO,NO,NO,NO,NO,NO,EQ,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,GT},/*i*/{NO,NO,NO,NO,NO,NO,NO,EQ,NO,NO,NO,NO,NO,NO,NO,NO,NO,GT},/*l*/{NO,NO,NO,NO,NO,NO,NO,NO,EQ,NO,NO,NO,NO,NO,NO,NO,NO,GT},/*e*/{NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,LT,NO,NO,NO,NO,NO,NO,GT},/*E*/{NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,GT},/*a*/{NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,EQ,NO,NO,EQ,NO,GT},/*=*/{NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,EQ,NO,NO,NO,NO,NO,NO,GT},/*+*/{NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,EQ,NO,NO,NO,GT},/*1*/{NO,NO,NO,NO,NO,GT,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,GT},/*>*/{NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,EQ,NO,GT},/*b*/{NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,GT},/*c*/{NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,NO,EQ,NO,NO,NO,NO,NO,GT},/*#*/{LT,LT,LT,LT,LT,LT,LT,LT,LT,LT,LT,LT,LT,LT,LT,LT,LT,EQ},};/*Impelementprecedencetableoperates */PreceGetPrecedence(constchar*c1,constchar*c2){ inti,j; i=CharToIndex(c1); j=CharToIndex(c2); if(i!=-1&&j!=-1) { returnPreTable[i][j]; } else { returnND; /*NotDefined*/ }}/*Convertterminals/nonterminalstotheindexoftheprecedencematrix */intCharToIndex(constchar*c){ switch(*c) { case'S':return0; case'd':return1; case'o':return2; case'B':return3; case'w':return4; case'h':return5; case'i':return6; case'l':return7; case'e':return8; case'E':return9; case'a':return10; case'=':return11; case'+':return12;case'1':return13;case'>':return14; case'b':return15; case'c':return16; case'#':return17; default:return-1; }}#endif/********************************************************************/Stack.h#ifndefSTACK_H#defineSTACK_H#include"Global.h"/* Stackoperates */voidInitStack();boolPush(constchar*);boolPop(char*);boolTopValue(char*);voidPrintStack();/* Stackattributes */charTheStack[STACKSIZE];intStackTop;/* Implementstackoperates */voidInitStack(){ charc='#'; StackTop=0; Push(&c);}boolPush(constchar*c){if(StackTop<STACKSIZE){TheStack[StackTop++]=*c;returntrue;}else{returnfalse;}}boolPop(char*c){if(StackTop>=0){*c=TheStack[--StackTop];returntrue;}else{returnfalse;}}boolTopValue(char*c){ if(StackTop>0) /*notnull*/ { *c=TheStack[StackTop-1]; returntrue; } else { returnfalse; }}voidPrintStack(){ inti; for(i=0;i<StackTop;i++) { printf("%c",TheStack[i]); } printf("\n");}#endif/******************************************************************/Global.h#ifndefGLOBAL_H#defineGLOBAL_Htypedefenum{false=0,true}bool;#defineGRAMMAR "G(s):S->doBwhileE,B->c=a+1,E=a>b"#defineBUFFSIZE100#defineSTACKSIZE100/*theinputbuffer */charBuff[BUFFSIZE];#endif/********************************************************************/Main.c#include"stdio.h"#include"Parse.h"#include"Global.h"#include<stdio.h>#include<stdlib.h>#include<string.h>#include<ctype.h>#include<malloc.h>#include<ctype.h>#include<conio.h>#defineNULL0#defineOK1#definesize100FILE*fp;charch;char*keyword[6]={"begin","else","end","if","then","var"};char*comparison[5]={"<","<=",">",">=","<>"};char*equal[1]={"="};char*interpunction[10]={",",";",":=",".","(",")","+","-","*","/"};char*now[2]={"while","do"};intflag[1]={1};charbuffer[10][100];intinc=-1;boolsearch(charsearchstr[],intwordtype){inti;switch(wordtype){case1:for(i=0;i<=5;i++) {if(strcmp(keyword[i],searchstr)==0)return(true);} break;case2:for(i=0;i<=4;i++){if(strcmp(comparison[i],searchstr)==0)return(true);} break;case3:for(i=0;i<=9;i++){if(strcmp(interpunction[i],searchstr)==0)return(true);} break;case4:for(i=0;i<=1;i++) {if(strcmp(now[i],searchstr)==0)return(true); } break; case5:{if(strcmp(equal[0],searchstr)==0)return(true); } break;}return(false);}charletterprocess(charch)//字母處理函數(shù){inti=-1,j=1;charletter[20];while(isalnum(ch)!=0){letter[++i]=ch;ch=fgetc(fp);}letter[i+1]='\0';if(search(letter,1)){ printf("<%s,->\n",letter);printf("aaaaa");flag[0]=0;}elseif(search(letter,4)) printf("<%s,->\n",letter);else{printf("<indentifier,%s>\n",letter);strcpy(buffer[++inc],letter);}return(ch);}charnumberprocess(char
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度生態(tài)園林建設(shè)綠化種樹承包合同2篇
- 2025年度養(yǎng)老院老人外出活動(dòng)責(zé)任分擔(dān)協(xié)議3篇
- 2025年度網(wǎng)約車司機(jī)兼職車輛使用協(xié)議3篇
- 2025年度男女朋友共同創(chuàng)業(yè)合作協(xié)議書3篇
- 2025年度海洋工程機(jī)械設(shè)備租賃協(xié)議2篇
- 二零二五年度高原特色農(nóng)產(chǎn)品進(jìn)出口銷售合同3篇
- 2025年度養(yǎng)殖產(chǎn)品市場銷售合作協(xié)議書2篇
- 2025年度公司管理人員兼職與聘用合同3篇
- 2025年度戶外廣告牌安裝與夜間照明安全協(xié)議3篇
- 二零二五年度農(nóng)村土地經(jīng)營權(quán)流轉(zhuǎn)與農(nóng)業(yè)產(chǎn)業(yè)扶貧合作合同3篇
- 小學(xué)生心理健康講座5
- 上海市市轄區(qū)(2024年-2025年小學(xué)五年級語文)部編版期末考試((上下)學(xué)期)試卷及答案
- 國家職業(yè)技術(shù)技能標(biāo)準(zhǔn) X2-10-07-18 陶瓷工藝師(試行)勞社廳發(fā)200633號
- 人教版八年級上冊生物全冊教案(完整版)教學(xué)設(shè)計(jì)含教學(xué)反思
- 2024年銀行考試-銀行間本幣市場交易員資格考試近5年真題附答案
- 人教版小學(xué)四年級數(shù)學(xué)上冊期末復(fù)習(xí)解答題應(yīng)用題大全50題及答案
- 冀教版五年級上冊脫式計(jì)算題100道及答案
- 你是排長我是兵(2022年山東濟(jì)南中考語文試卷記敘文閱讀題及答案)
- 《ISO56001-2024創(chuàng)新管理體系 - 要求》之22:“8運(yùn)行-8.2 創(chuàng)新行動(dòng)”解讀和應(yīng)用指導(dǎo)材料(雷澤佳編制-2024)
- 廣東省中山市2023-2024學(xué)年高三物理上學(xué)期第五次統(tǒng)測試題含解析
- 《體育科學(xué)研究方法》題庫
評論
0/150
提交評論