




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
編譯原理課程設(shè)計關(guān)于DO-WHILE語句的語法分析程序設(shè)計09計科一班吳龍2009221104210014PAGEPAGE1編譯原理課程設(shè)計關(guān)于DO-WHILE語句的語法分析程序設(shè)計09計科一班吳龍2009221104210014目錄摘要………………1一、問題的重述………………2二、問題的背景………………2三、名詞解釋以及一些基本概念…………2四、文法及屬性文法的描述…………………3五、語法分析方法及中間代碼形式的描述……………35.1語法分析方法描述………35.1.1簡單優(yōu)先法的基本思想………………35.1.2簡單優(yōu)先基本分析思路框圖…………5.1.3中間代碼形式描述……………………5.2簡單的分析與概要設(shè)計…………………55.3詳細的算法描述…………55.4Global的主要算法………65.5Parse的主要算法………65.6Prece的主要算法………85.7 Stack的主要算法………9六、軟件的測試方法和測試結(jié)果…………10七、設(shè)計的特點,不足,收獲與體會………11八、參考文獻:…………………12九、附錄:…………13Parse.h……………………13Prece.h……………………15Stack.h……………………17Global.h……………………19Main.c……………………19關(guān)于DO-WHILE語句的語法分析程序設(shè)計摘要用高級語言程序設(shè)計的語言(簡稱高級語言)編寫的程序方便,效率高,但是計算機不能直接執(zhí)行用高級語言編寫的程序,只能直接執(zhí)行機器語言程序,因此用高級語言編寫的程序必須有一個翻譯程序翻譯成機器語言程序?,F(xiàn)在計算機系統(tǒng)一般都含有不只一個的高級語言的編譯程序。高級語言編譯程序是計算機系統(tǒng)軟件最主要的組成部分之一,也是用戶最直接關(guān)系的工具之一。計算機上執(zhí)行一個高級語言程序一般分為兩步:第一,用一個編譯程序把高級語言翻譯成機器語言程序;第二,運行所得的機器語言程序求得計算結(jié)果。編譯程序各階段的任務(wù)包括:詞法分析器(必要);語法分析器(必要);語義分析與中間代碼生成器(可選);代碼優(yōu)化(可選);目標(biāo)代碼生成器(必要)。本程序的設(shè)計用于判斷do-while語句文法,涉及到編譯五個階段中的三個,即詞法分析器、語法分析器、語義分析和中間代碼生成器。編譯程序的輸出結(jié)果包括詞法分析后的二元式序列、變量名表、及四元式序列程序。整個編譯程序分為四部分:詞法分析部分、語法分析處理及四元式生成部分、輸出顯示部分。語法分析使用的是至上而下的分析方法——簡單優(yōu)先分析方法,通過構(gòu)造Warshall算法,構(gòu)造關(guān)系first與last,進而求出文法關(guān)系矩陣。最后由關(guān)系矩陣得出符號串的分析過程,最終判斷該符號串是否為此文法的一個句型。關(guān)鍵詞:至上而下的分析方法簡單優(yōu)先分析方法四元組Warshall算法關(guān)系矩陣一、問題的重述輸入一個DO-WHILE的語句,可以輸出判斷此語句是否為DO-WHILE該文法的一個句子。首先對這個語句進行詞法分析,詞法分析器利用超前搜索,狀態(tài)轉(zhuǎn)換等方法,將源程序轉(zhuǎn)化成為一個一個的單詞符號二元式,如果詞法分析無誤,則進入語法分析部分,使用簡單優(yōu)先法進行文法分析,在每個終結(jié)符與非終極符之間定義優(yōu)先關(guān)系,利用優(yōu)先關(guān)系進行移進-規(guī)約,如果能規(guī)約到文法的開始符,則文法分析成功,輸出四元式.二、問題的背景用高級語言程序設(shè)計的語言(簡稱高級語言)編寫的程序方便,效率高,但是計算機不能直接執(zhí)行用高級語言編寫的程序,只能直接執(zhí)行機器語言程序,因此用高級語言編寫的程序必須有一個翻譯程序翻譯成機器語言程序。這個翻譯程序的執(zhí)行過程十分的復(fù)雜,其主要功能是將源程序翻譯成等價的目標(biāo)程序,一般標(biāo)準(zhǔn)的編譯程序可以分為詞法分析、語法分析、語義分析、中間代碼生成、中間代碼優(yōu)化和目標(biāo)代碼生成等階段來實現(xiàn)的。詞法分析:詞法分析是編譯過程的基礎(chǔ),其任務(wù)是掃描源程序。根據(jù)源程序的詞法規(guī)則,分解和識別出每一個單詞,并把單詞翻譯成相應(yīng)的機內(nèi)表示,當(dāng)然,詞法分析在標(biāo)識單詞的過程中,同時也做語法檢查。單詞是語言中最小的語義單位,如語言中的關(guān)鍵字、標(biāo)識符和常量等。語法分析:語法分析是在詞法分析的基礎(chǔ)上進行的。語法分析的任務(wù)是根據(jù)語言的語法規(guī)則,把單詞符號串分解成各類的語法單詞,如表達式、語句等。通常語言分析、可以確定整個輸入符號串是否構(gòu)成一個語法正確的程序。語義分析:語義分析是對源程序進行語義檢查,其目的是保證標(biāo)識符和常數(shù)的正確使用。中間代碼生成以及中間代碼優(yōu)化:對于編譯程序來說并不是必不可少的。目標(biāo)代碼生成:目標(biāo)代碼生成是編譯程序的最后階段。因此,本文就此也僅對編譯程序中循環(huán)語句DO-While的語法分析過程做一個設(shè)計——DO-WHILE語法分析器。三、名詞解釋以及一些基本概念名詞解釋及其概念1、自上而下的分析方法:它是一種移進-規(guī)約方法。需要用到一個符號棧,檢查符號串的符號逐個被“移進”S棧,當(dāng)棧頂符號串和某個產(chǎn)生式右部相匹配時,這個符號串被替換成“規(guī)約”改產(chǎn)生式左部為非非終結(jié)符。2、簡單優(yōu)先分析方法:它是一種典型的自上而下的分析方法,它對符號串語法分析的過程,實際就是一個規(guī)約的過程。這個規(guī)約過程中,它根據(jù)文法符號之間的簡單優(yōu)先關(guān)系來尋找符號串中可進行的子串,此子串稱為句柄。一個文法G,若它不含e產(chǎn)生式,也不含任何右部相同的不同產(chǎn)生式,并且它的任何符號對(X,Y),或者沒有關(guān)系,或者存在下述三種關(guān)系:=、<、>之一,則稱該文法是一個簡單優(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)缺點:優(yōu)點:技術(shù)簡單缺點:適用范圍小,分析表尺寸太大。四、文法及屬性文法的描述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)系用一個矩陣表示,稱作簡單優(yōu)先矩陣。PDA讀入一個單詞后,比較棧頂符號和該單詞的優(yōu)先級,若棧頂符號優(yōu)先級低于該單詞,繼續(xù)讀入;若棧頂符號優(yōu)先級高于或等于讀入符號,則找句柄進行歸約,找不到句柄就繼續(xù)讀入。直到最后棧內(nèi)只剩下開始符號,輸入串讀到“?!睘橹埂4藭r識別正確??煞贮c描述如下:1、對句型中相鄰的文法符號規(guī)定優(yōu)先關(guān)系,以尋找句型中的句柄;2、規(guī)定句柄內(nèi)各相鄰符號之間具有相同的優(yōu)先級;3、規(guī)定句柄兩端符號優(yōu)先級要比位于句柄之外而又和句柄相鄰的符號的優(yōu)先級高,以先歸約句柄;4、對于文法中所有符號,只要它們可能在某個句型中相鄰,就要為它們規(guī)定相應(yīng)的優(yōu)先關(guā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如上圖是一個簡單優(yōu)先算法框圖。算法中,用到了一個符號棧S,棧頂指針為i,輸入符號串放在數(shù)字符號組TR中,j是下標(biāo)。令#<TR[j],S[i]>#.在尋找句型的句柄時,總是先找到句柄的尾符號,然后再向前搜索器首符號。如果S[i]>TR[j],則此S[i]為句柄尾符號,句柄尾符號找到之后,再往前比較兩個相鄰的符號,如果S[k-1]<S[k],則此S[k]便是句柄之首符號。無論是比較S[i]與TR[j],還是比較S[k-1]與S[k],它們的一句都是文法簡答優(yōu)先關(guān)系矩陣。找到了句柄,就可以用它去查文法的產(chǎn)生式表,如果有某一個產(chǎn)生式的右部和句柄相匹配,則用改產(chǎn)生式的左部符號(一個非終結(jié)符)去替換符號棧中的這個句柄。最后,如果S[i]為文法標(biāo)識符,而TR[j]為“#”號,則表示輸入的符號串是文法的一個句子,算法終止,否則,輸入符號串不是文法的一個句子。5.1.3四元式是一種比較普遍采用的中間代碼形式。四元式的四個組成成分是:算符op,第一和第二運算對象ARG1和ARG2及運算結(jié)果RESULT。運算對象和運算結(jié)果有時指用戶自己定義的變量,有時指編譯程序引進的臨時變量。例如:輸入字符串doc=a+1whilea>b則輸出四元式(1)(+,a,1,c)(2)(>,a,b,t0)(3)(=,t0,true,1)(4)(-,-,-,-)5.2簡單的分析與概要設(shè)計整個工程分為5個文件:Main.c程序的入口點,輸入待分析的字符串后先進行詞法分析,然后調(diào)用兩個函數(shù)進行語法分析及產(chǎn)生中間代碼。Global.h定義了一些全局變量及宏P(guān)arse.h語法分析器的主要算法Prece.h定義和實現(xiàn)了一些關(guān)于優(yōu)先級的操作Stack.h定義和實現(xiàn)了一個棧及其操作5.3詳細的算法描述voidInputString()//輸入字符串{intlen=0; printf("表達式文法為:");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<表達式>\n");printf("翻譯的語句:doc=a+1whilea>b\n"); cifa();//調(diào)用詞法分析程序,對輸入字符串進行詞法分析 InputString();//再次輸入待分析字符串以便進行語法分析Parse();//調(diào)用語法分析,對輸入字符串進行語法分析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)先符是小于或等于則壓棧,否則進棧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); //輸入符號流第一個元素 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è)計的特點,不足,收獲與體會這次編譯原理課程設(shè)計的題目是用簡單優(yōu)先分析法進行DO-WHILE循環(huán)語句的語法分析,并輸出四元式.設(shè)計的特點是利用定義每個終極符和非終極符之間優(yōu)先關(guān)系,來進行符號的移進與規(guī)約,如果棧頂符號優(yōu)先級低于該單詞,繼續(xù)讀入;若棧頂符號優(yōu)先級高于或等于讀入符號,則找句柄進行歸約,找不到句柄就繼續(xù)讀入。這樣使得程序簡化,只需定義一個棧用來存放移進的字符,然后用棧頂指針指向它后與待移進字符比較優(yōu)先級即可,設(shè)計簡單.此設(shè)計的嚴(yán)重不足是只能進行一個固定句子的詞法與語法分析,因為在定義優(yōu)先關(guān)系時已固定了DO,和WHILE的每個字符之間的優(yōu)先關(guān)系,且賦值表達式和條件式也已固定,所以只能進行本程序已約定好的語句.最大的收獲是在提出一個難題以后,如果能比較順手的解決的話,那是一件比較開心的事。只是有些時候越想問題就會越多,也越難解決,那就得慢慢調(diào)試,慢慢推導(dǎo)了。相信只要想得出,就能調(diào)得出,當(dāng)然耐心是很重要的,花在上面的時間也是要多一點的。完成此次課程設(shè)計以后,覺得自己在編譯原理的學(xué)習(xí)中存在很多的不足和需要提高的地方.通過對簡單優(yōu)先法翻譯程序的編程也使自己在編寫編譯程序上有了感官的認(rèn)識,且能力也得到了一定的提高!雖然此程序還存在很多的缺點與不足,但在將來的學(xué)習(xí)中我會不斷的完善此部分知識.獨立的完成程序以后也有不少收獲,為自己在以后的學(xué)習(xí)中做了很好的鋪墊!參考文獻:[1]何炎祥《編譯原理》,華中科技大學(xué)出版社,2009年2月。[2]張素琴、呂映芝、蔣維杜、戴桂蘭等.編譯原理(第二版).清華大學(xué)出版社.2005[3]閔聯(lián)營、何克右.C++程序設(shè)計教程.武漢理工大學(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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 遼寧省大連市2022-2023學(xué)年高二下學(xué)期期末考試化學(xué)試題(含答案)
- 介紹玩具活動方案
- 從軍夏日活動方案
- 倉儲貨架促銷活動方案
- 倉庫清理活動方案
- 付費專欄活動方案
- 代表之家活動方案
- 代賬公司節(jié)假日活動方案
- 企業(yè)與企業(yè)團建活動方案
- 企業(yè)代言活動方案
- 科室醫(yī)療質(zhì)量與安全管理小組成員及職責(zé)
- 公車駕駛員安全教育
- 《選品與采購》課件-4.電商采購
- T-HSPP 0017-2024 含多肽氨基酸水溶肥料
- 《慢性腎臟病肌少癥診斷、治療與預(yù)防專家共識(2024年版)》解讀
- 突發(fā)公共衛(wèi)生事件衛(wèi)生應(yīng)急
- 2023年學(xué)校管理心理學(xué)考試復(fù)習(xí)題庫(含答案)
- 關(guān)于納粹德國元首希特勒的歷史資料課件
- 2024年黨建知識競賽培訓(xùn)題庫及答案
- PVC膜生產(chǎn)工藝流程
- 河北省邯鄲市(2024年-2025年小學(xué)四年級語文)部編版小升初模擬((上下)學(xué)期)試卷及答案
評論
0/150
提交評論