




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、精選優(yōu)質(zhì)文檔-傾情為你奉上實驗一 詞法掃描器設(shè)計一 實驗?zāi)康耐ㄟ^設(shè)計調(diào)試詞法分析程序,實現(xiàn)從源程序中分出各種單詞的方法;加深對課堂教學的理解;提高詞法分析方法的實踐能力。二 實驗內(nèi)容設(shè)計一個簡單的類C語言的詞法掃描器。三 實驗要求1、根據(jù)附錄給定的文法,從輸入的類C語言源程序中,識別出各個具有獨立意義的單詞,即關(guān)鍵字、標識符、常數(shù)、運算符、分隔符五大類;文法見最后附錄。2、提供源程序輸入界面;3、詞法分析后可查看符號表和TOKEN串表;4、保存符號表和TOKEN串表(如:文本文件); 5、遇到錯誤時可顯示提示信息,然后跳過錯誤部分繼續(xù)進行分析。四 實驗報告(一) 系統(tǒng)功能(包括各個子功能模塊的
2、功能說明)程序主要實現(xiàn)的功能:通過詞法分析程序,在源程序中識別并分別出數(shù)字、標識符和保留字,并分別將記錄到指定的文本文檔中,過程中不符合符號表要求的字符視為錯誤處理。子功能模塊:關(guān)鍵字處理;數(shù)字處理;字母的處理(標識符和保留字);運算符處理;主程序。(二) 開發(fā)平臺(操作系統(tǒng)、設(shè)計語言)Windows 7,Microsoft Visual C+ 6.0。(三) 設(shè)計方案(1) 主數(shù)據(jù)流圖(2) 主要子程序的流程框圖(3) 主要數(shù)據(jù)結(jié)構(gòu):id® Letter <temp>int10® Num int10 | Num OP® +| - |* |/ |>
3、;| < | = | ( | ) | ; | | = | >= |<= | !=Keyword®if | then | else | while | do Letter®a|b|c|d|e|f|g|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z|A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|ZNum®0|1|2|3|4|5|6|7|8|9 |<temp>® Letter <temp> | Num <temp> |(四) 具體
4、設(shè)計過程(包括主控程序、各個功能模塊的具體實現(xiàn))主模塊:judge(FILE *,char *);用詞法分析過程的判斷子功能模塊:Keyword(string );用于判斷字符串是否是關(guān)鍵詞 Letter(char c);用于判斷c是否是字母 Num(char c);用于判斷c是否是數(shù)字 (五) 源代碼#define MAX 50 /長度最大值 50 char ch =' ' / 字符 空格string keyword50="bool","break","case","include","
5、char","const", "continue","default","do","double","else","false", "float","for","if","int","long","namespace","new","return", "short",&
6、quot;signed","struct","switch","true","using","void","while" ,"then","class" ; / 常見關(guān)鍵字數(shù)組 只用了部分30個/*關(guān)鍵字的處理過程*int gjz(string c) int i; for(i=0;i<MAX;i+) if(pare(c)=0) return 1; /與關(guān)鍵字數(shù)組中用相同的就返回真,否則假 retu
7、rn 0;/*字母的處理過程*int zm(char c) if(c<='z')&&(c>='a')|(c<='Z')&&(c>='A') return 1; /比較字母的ASCII碼值,在大小寫范圍內(nèi),返回真,否則假。 else return 0;/*數(shù)字的處理過程*int num(char c) if(c>='0'&&c<='9') return 1; /比較字母的ASCII碼值,在0-9范圍內(nèi),返回真,否則假。
8、 else return 0;/*運算符處理過程*/ 過程中指針總是向前看一個,決定當前的各種單詞是否結(jié)束,或是根據(jù)后邊的輸入消除當前字符二義性。void caculate(FILE *fpin)ofstream out("lex.txt",ios:out); /文件token.txt輸入內(nèi)存 string arr="" /字符串 while(ch=fgetc(fpin)!=EOF) /沒到文件末尾,循環(huán)至末尾 arr="" if(ch=' '|ch='t'|ch='n') /空格,縮進
9、,換行,均不做操作 else if(zm(ch) /若有字符 while(zm(ch)|num(ch) /當有字符或數(shù)字的時候,循環(huán) arr=arr+ch; /組織拼接字符串 ch=fgetc(fpin); /ch 得到文件輸入字符 fseek(fpin,-1L,SEEK_CUR); /循環(huán)結(jié)束后,重定位流指針,從當前位置左移一位。開始判斷新的輸入是什么類型 if (gjz(arr)out<<arr<<"t1"<<"t關(guān)鍵字"<<endl; /若是關(guān)鍵字,則輸出類型1,關(guān)鍵字 else out<<
10、;arr<<"t2"<<"t標識符"<<endl; /若是標識符,則輸出類型2,標識符 else if(num(ch) /若是數(shù)字 while(num(ch)|ch='.'&&num(fgetc(fpin)|fgetc(fpin)='e'|ch='e')/ 數(shù)字 | . &&(得到一個字符|字符是e|輸入是e) if(ch='.') /. fseek(fpin,-1L,SEEK_CUR);/指針左移 arr=arr+ch;
11、if(ch='e') /e,自然對數(shù)的底數(shù) ch=fgetc(fpin); / 新讀入 if( ch='+') arr+='+' else arr+='-', fseek(fpin,-1L,SEEK_CUR);/指針左移 ch=fgetc(fpin); fseek(fpin,-3L,SEEK_CUR); / 指針左移3 out<<arr<<"t3"<<"t無符號數(shù)"<<endl; /無符號數(shù) 3 else switch(ch) case'
12、;+': case'-' : case'*' : case'=' : case'/' :out<<ch<<" t4"<<"t運算符"<<endl;break; /+ - * / = 運算符 4 case'(' : case')' : case'' : case'' : case'' : case'#' : case'.' :
13、case',' : case'' : case'' :out<<ch<<" t5"<<"t界限符"<<endl;break; / (),.#; 界限符 case '"': string string1="" do string1+=ch; ch=fgetc(fpin); while (ch!='"');/循環(huán)得到 "" string1+=ch; out<<s
14、tring1<<"t6"<<"t字符串"<<endl; /字符串 6 break; case':' :ch=fgetc(fpin); if(ch='=') out<<":="<<" t4"<<"t運算符"<<endl; /運算符 :=else out<<"="<<" t4"<<"t運算符"
15、;<<endl; /運算符 = fseek(fpin,-1L,SEEK_CUR); /當指針回退一個字符 break; case'<' :ch=fgetc(fpin); if(ch='=')out<<"<="<<" t4"<<"t運算符"<<endl; /運算符 <= if(ch<='z')&&(ch>='a')|(ch<='Z')&&a
16、mp;(ch>='A') fseek(fpin,-1L,SEEK_CUR); /指針回退一個字符 out<<"<"<<" t5"<<"t界限符"<<endl; /界限符 <else if(ch='<')out<<"<<"<<" t7"<<"t控制符"<<endl; /控制符 << else if(ch=
17、'>') out<<"<>"<<" t4"<<"t運算符"<<endl;/運算符 <> elseout<<"<"<<" t4"<<"t運算符"<<endl; /運算符 <fseek(fpin,-1L,SEEK_CUR); /指針回退一個字符 break;case'>' :ch=fgetc(fpin);
18、if(ch='=') out<<">="<<" t4"<<"t運算符"<<endl; /運算符 >= if(ch='>')out<<">>"<<" t7"<<"t控制符"<<endl; /控制符 >> if(ch='n')fseek(fpin,-1L,SEEK_CUR); out<<
19、;">"<<" t5"<<"t界限符"<<endl; /界限符 > 后邊沒有操作數(shù)。 else out<<">"<<" t4"<<"t運算符"<<endl; /運算符 > fseek(fpin,-1L,SEEK_CUR); break; default : out<<ch<<" t無法識別字符"<<endl; /無
20、法識別字符 void read()ifstream in("lex.txt",ios:out); /內(nèi)存輸出lex.txt內(nèi)容string x; while(in) /輸入格式的確定in>>x; /cin>>x;就表示從標準輸入流中讀取一個指定類型(即變量x的類型)的數(shù)據(jù)。cout<<x<<'t'in>>x;cout.width(30);cout<<x<<'t'in>>x;cout.width(30);cout<<x<<en
21、dl; /*主程序*void main() char in_fn30; /定義存放文件路徑的數(shù)組 FILE * fpin; cout<<"請輸入源文件名(包括路徑和后綴名): n" for(;) /無條件循環(huán) cin>>in_fn; /輸入路徑名 if(fpin=fopen(in_fn,"r")!=NULL) break; /以只讀方式打開文件,如果成功跳出循環(huán)繼續(xù),若不成功則輸出錯誤信息。 else cout<<"文件路徑錯誤!請輸入源文件(包括路徑和后綴名):" cout<<&quo
22、t;n*詞法分析結(jié)果如下*"<<endl; caculate(fpin); /調(diào)用分析程序 fclose(fpin); /關(guān)閉文件 cout<<endl; /結(jié)束行 read(); /調(diào)用read(),完成輸出 /分析文本文件 內(nèi)容為一個簡單的C語言程序 cout<<"n*lex.txt 詞法分析完畢*"<<endl; system("pause"); /屏幕停留五 實驗結(jié)果運行結(jié)果源代碼六 實驗總結(jié) 通過本次試驗,我更加詳細的了解了詞法分析器的構(gòu)造過程和工作原理。作為編譯器的第一步,詞法分析器起
23、著重要的作用,它識別并分別出數(shù)字和字母(標識符和保留字),構(gòu)成并輸出TOKEN序列,為后面的語法分析和語義分析建立基礎(chǔ)。同時,本實驗也是我對于編譯器的一些基本行為有了一定的了解,讓我能夠更加有效率的編寫程序。實驗二 LR語法分析器設(shè)計一 實驗?zāi)康耐ㄟ^設(shè)計調(diào)試LR語法分析程序,實現(xiàn)根據(jù)詞法分析的輸入TOKEN字,進行文法的語法分析;加深對課堂教學的理解;提高語法分析方法的實踐能力。二 實驗內(nèi)容使用附錄中的文法,可以對類似下面的程序語句進行語法分析:int a;int b;int c;a=2;b=1; if (a>b)c=a+b;elsec=a-b;三 實驗要求(一) 程序設(shè)計要求(1)給出
24、主要數(shù)據(jù)結(jié)構(gòu):分析棧、符號表;(2)將掃描器作為一個子程序,每次調(diào)用返回一個TOKEN;(3)程序界面:表達式輸入、語法分析的表示結(jié)果(文件或者圖形方式);(二)實驗報告撰寫要求(1)系統(tǒng)功能分析與設(shè)計(包括各個子功能模塊的功能說明);(2)開發(fā)平臺(操作系統(tǒng)、設(shè)計語言);(3)設(shè)計方案:包括功能模塊結(jié)構(gòu)圖、主要函數(shù)的流程圖;(4)主要數(shù)據(jù)結(jié)構(gòu):分析棧、分析表、符號表;(5)具體設(shè)計實現(xiàn)過程(包括主控程序、各個功能模塊的具體實現(xiàn))。四 實驗設(shè)計(一) 系統(tǒng)功能語法分析器的主要功能:是否可以以及如何從語法的起始符號推導(dǎo)出輸入符號串。根據(jù)語法分析的規(guī)則,其必須以$作為終結(jié)符,各個語句之間;間隔,判
25、斷其是否符合語法規(guī)則,一依次輸出判斷過程中所用到的產(chǎn)生式,并輸出最終結(jié)論,若有錯誤可以報錯并提示錯誤所在行數(shù)及原因。(二) 開發(fā)平臺Windows 7,Microsoft Visual C+ 6.0(Dos),C+。(三) 設(shè)計方案對輸入的源碼文件進行此法分析,產(chǎn)生符號表->開始LR語法分析;詞法分析:處理注釋部分->換行處理/字符處理/數(shù)字處理/其他處理(運算法,界限符等)->詞法分析產(chǎn)生符號表;LR語法分析:利用閉包運算和GOTO函數(shù)原理來對token進行語法分析,并輸出分析的結(jié)果;(四) 數(shù)據(jù)結(jié)構(gòu)分析棧struct Symbolchar name50;char *typ
26、e;int value;Symbol1000;分析表Table3120數(shù)組108,0,0,0,0,0,0,0,0,0,0,0,0,1,2,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,0,0,0,0,0,109,0,0,0,0,0,0,0,0,113,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,201,0,0,0,0,0,0,0,0,0,0,0,105,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,106,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,108,0,20
27、3,0,0,0,0,0,0,0,0,203,0,0,7,0,4,0,0,0,0,0,202,0,0,0,0,0,0,0,0,202,0,0,0,0,0,0,0,0,0,0,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,110,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,126,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,11,25,0,112,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,205,0,205,0,0,0,0,0,0,0,0,
28、0,0,0,114,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,126,0,0,0,0,0,0,127,0,0,0,0,0,0,0,15,28,25,0,0,0,0,0,116,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,109,0,0,0,0,0,0,0,113,0,0,0,0,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,118,0,0,0,0,0,0,0,0,0,109,0,0,0,0,0,0,0,113,0,0,0,0,19,0,0,0,0,0,0,0,0,0,0,0,0,0,0,206,0,206,0,0,0,0,0
29、,0,0,0,0,0,0,0,0,0,121,123,0,0,0,0,0,0,0,0,0,0,0,0,0,126,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,22,0,208,0,0,0,0,208,208,208,0,0,0,0,0,0,0,0,0,0,0,0,0,126,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,24,0,209,0,0,0,0,209,209,209,0,0,0,0,0,0,0,0,0,0,0,0,210,0,0,0,0,210,210,210,0,0,0,0,0,0,0,0,0,0,0,0,211,0,0,0,0,211
30、,211,211,0,0,0,0,0,0,0,0,0,0,0,0,212,0,0,0,0,212,212,212,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,129,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,126,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,30,25,0,0,0,0,0,207,0,0,0,0,0,0,0,0,0,0,0,0,0,0符號表struct Tokenchar *type;int attr;Token1000;(5) 重要函數(shù)處理注釋文字char Explain(char ch)/處理注釋的函數(shù)int
31、i = START;/數(shù)組下標從0開始char EwordMAXSIZE;/存放字符或者字符串char ch1;ch1 =ch;Eword+i = ch1;ch1 = fgetc(Source);if(ch1 = '/')/此時為單行注釋while(ch1 != 'n')fprintf(Middle,"%c",' ');ch1 = fgetc(Source);fprintf(Middle,"%c",'n');ch1 = fgetc(Source);else if(ch1 = '*
32、39;)/此時為多行注釋while(!(ch1 = '/')&&(Ewordi = '*')if(ch1 = 'n')fprintf(Middle,"%c",'n');Eword+i = ch1;fprintf(Middle,"%c",' ');ch1 = fgetc(Source);ch1 = fgetc(Source);else/此時為除號printf("%c",Eword0);fprintf(Middle,"%c"
33、,Eword0);return ch1; LR分析法實現(xiàn)語法分析int LR()int tao1000=0;/用于存放語法分析過程中的狀態(tài)int top=0;/存放棧頂?shù)奈恢胕nt point=0;/存放Token表,即輸入表的當前位置int count;/用于掃描endchar數(shù)組時的計數(shù)char *input;/暫時保存輸入表中的當前位置上的內(nèi)容/char head;/用于保存產(chǎn)生式的頭部int num,state;input=Tokenpoint.type;while(point<Ti)/input=Tokenpoint.type;for(count=0;count<20;c
34、ount+)/if(*input)=(*(endcharcount)if(!(strcmp(input,endcharcount)break;/count此時保存語法分析表的列號num=Tabletaotopcount;if(num=0)printf("Wrong in LR!Wrong in %s!",input);elsestate=num%100;/得到十位及個位上的數(shù)字num=num/100;/用于辨別是移入1,規(guī)約2還是其他0switch(num)case 0:/GOTO表部分top+;/將該狀態(tài)壓棧taotop=state;input=Tokenpoint.ty
35、pe;break;case 1:/執(zhí)行移入操作top+;/將該狀態(tài)壓棧taotop=state;point+;/指向輸入表中的下一個位置input=Tokenpoint.type;break;case 2:/執(zhí)行規(guī)約操作top=top-(int)(*productorstate1-48);/出棧的個數(shù)/printf("top=%d",top);input=productorstate2;printf("<%s>n",productorstate0);/goto L;break;case 10:point+;input=Tokenpoint.t
36、ype;break;default:printf("Wrong in LR!Wrong in %s!",input);if(point=Ti)&&(num=10)return 1;elsereturn 0; 詞法分析函數(shù)同實驗一,故略。(六) 具體實驗過程主程序流程圖:五 實驗結(jié)果運行結(jié)果:六 實驗總結(jié)經(jīng)過本次的實驗,使我真正的了解語法分析器的實現(xiàn)過程,讓我更加深刻的語法分析器的實現(xiàn)原理,雖然在本次試驗中遇到了各種各樣的困難和錯誤,但在同學的幫助下還是把錯誤改正過來了,是的語法分析器能夠正確的識別相應(yīng)的語法和表達式。附錄:簡單類c語言文法產(chǎn)生式 語義規(guī)則注:
37、P為文法的開始符號說明語句部分文法:P D SD L id ; D |L int | float程序語句部分文法:S id = E; S.code = E.code | gen(id.place:=E.place)S if (C) S1 C.true = newlabel; C.false = S.next;S1.next = S.next;S.code = C.code | gen(C.true:) | S1.codeS if (C) S1 else S2S while (C) S1 do S2C.true = newlabel; C.false = newlabel;S1.next = S
38、2.next =S.next;S.code = C.code | gen(C.true:) | S1.code| gen(gotoS.next)| gen(C.false:)| S2.code;S S ;SC E1 > E2C.code = E1.code | E2.code |gen(ifE1.place>E2.placegotoC.true) |gen(gotoC.false)C E1 < E2 C.code = E1.code | E2.code |gen(ifE1.place<E2.placegotoC.true) |gen(gotoC.false)C E1 =
39、 E2 C.code = E1.code | E2.code |gen(ifE1.place=E2.placegotoC.true) |gen(gotoC.false)E E1 + T E.place = newtemp;E.code = E1.code|T.code|gen(E.place:=E1.place+T.place)E E1 T E.place = newtemp; E.code = E1.code | T.code |gen(E.place:=E1.place-T.place)E T E.place = T.place; E.code = T.codeT F T.place =
40、F.place; T.code = F.codeT T1 * F T.place = newtemp;T.code = T1.code | F.code |gen(T.place:=T1.place*F.place)T T1 / F T.place = newtemp; T.code = T1.code | F.code |gen(T.place:=T1.place/F.place)F ( E ) F.place = E.place; F.code = E.codeF id F.place = ; F.code = F int10 F.place = int10.value; F
41、.code = 實驗三 語義分析及中間代碼生成一 實驗?zāi)康耐ㄟ^上機實習,加深對語法制導(dǎo)翻譯原理的理解,掌握將語法分析所識別的語法范疇變換為某種中間代碼的語義翻譯方法。二 實驗內(nèi)容實現(xiàn)簡單的高級語言源程序的語義處理過程。三 實驗要求程序設(shè)計要求(1) 目 標 機:8086及其兼容處理器(2) 中間代碼:三地址碼(3) 設(shè)計結(jié)果:語法分析樹(節(jié)點具有屬性)、三地址碼表、符號表、TOKEN串表(4) 語義分析內(nèi)容要求:1) 變量說明語句2) 賦值語句3) 控制語句(任選一種)(5) 其它要求:1) 將詞法分析(掃描器)作為子程序,供語法語義程序調(diào)用;2) 使用語法制導(dǎo)的語義翻譯方法;3) 編程語言自
42、定;4) 最好提供源程序輸入界面;5) 目標代碼生成暫不做;6) 編譯后,可查看TOKEN串、符號表、三地址碼表;7) 主要數(shù)據(jù)結(jié)構(gòu):產(chǎn)生式表、符號表、三地址碼表。 所用文法使用實驗2中的文法。附錄:語義分析源程序范例int a;int b;int c;a=2;b=1; if (a>b)c=a+b;elsec=a-b;四 實驗設(shè)計(1) 系統(tǒng)功能分析與設(shè)計本程序功能:本程序可對一段包含運算符的賦值語句依次進行詞法分析、語法分析、語義分析以及生成中間代碼。主要進行語義分析并生成中間代碼,根據(jù)輸入的符號串簡歷分析樹并建立相應(yīng)的依賴圖,最后完成根據(jù)語義規(guī)則的運算。(2) 開發(fā)平臺(開發(fā)軟硬件環(huán)
43、境)Windows 7,Microsoft Visual C+ 6.0(三)語義翻譯中使用的數(shù)據(jù)結(jié)構(gòu)struct token/詞法 token結(jié)構(gòu)體int code;/編碼int num;/遞增編號token *next;token *token_head,*token_tail;/token隊列struct str/詞法 string結(jié)構(gòu)體int num;/編號string word;/字符串內(nèi)容str *next;str *string_head,*string_tail;/string隊列struct ivan/語法 產(chǎn)生式結(jié)構(gòu)體char left;/產(chǎn)生式的左部string right
44、;/產(chǎn)生式的右部int len;/產(chǎn)生式右部的長度;ivan css20;/語法 20個產(chǎn)生式struct pank/語法 action表結(jié)構(gòu)體char sr;/移進或歸約int state;/轉(zhuǎn)到的狀態(tài)編號;pank action4618;/action表int go_to4611;/語法 go_to表struct ike/語法 分析棧結(jié)構(gòu)體,雙鏈ike *pre;int num;/狀態(tài)int word;/符號編碼ike *next;ike *stack_head,*stack_tail;/分析棧首尾指針struct L/語義四元式的數(shù)據(jù)結(jié)構(gòu)int k;string op;/操作符strin
45、g op1;/操作數(shù)string op2;/操作數(shù)string result;/結(jié)果L *next;/語義四元式向后指針L *Ltrue;/回填true鏈向前指針L *Lfalse;/回填false鏈向前指針;L *L_four_head,*L_four_tail,*L_true_head,*L_false_head;/四元式鏈,true鏈,false鏈struct symb/語義輸入時符號表string word;/變量名稱int addr;/變量地址symb *next;symb *symb_head,*symb_tail;/語義符號鏈表(四)程序具體設(shè)計實現(xiàn)過程(包括主要功能模塊的具體實
46、現(xiàn)) (5) 重要函數(shù)語義分析函數(shù)void yuyi_main(int m)L *temp;int k;k=1;temp=new L;temp->op=" "temp->op1=" "temp->op2=" "temp->result=""temp->next=NULL;temp->Ltrue=NULL;temp->Lfalse=NULL;if(m=4)/變量聲明時加入符號表鏈symb *Stemp;Stemp=new symb;id_name=id_numtoname(i
47、d_num);Stemp->word=id_name;Stemp->next=NULL;add_symb(Stemp);if(m=5)/歸約EE+Ttemp->op="+"temp->op1=E_name;temp->op2=T_name;yuyi_linshi+;/申請臨時變量E_name="t"+newop(yuyi_linshi);temp->result=E_name;add_L_four(temp);/加一個四元式結(jié)點if(m=6)/歸約ETE_name=T_name;if(m=7)/歸約TT*Ftemp-&
48、gt;op="*"temp->op1=T_name;temp->op2=F_name;yuyi_linshi+;/申請臨時變量T_name="t"+newop(yuyi_linshi);temp->result=T_name;add_L_four(temp);/加一個四元式結(jié)點if(m=8)/歸約TFT_name=F_name;if(m=9)/歸約F(E)F_name=E_name;if(m=10)/歸約Fidid_name=id_numtoname(id_num);F_name=id_name;k=lookup(id_name);/檢
49、查變量是否聲明if(k=0)err=2;errword=id_name;return;if(m=12)/歸約Bid>idtemp->op="J>"id1_num=id_num-1;id1_name=id_numtoname(id1_num);k=lookup(id1_name);/檢查變量是否聲明if(k=0)err=2;errword=id1_name;return;id2_num=id_num;id2_name=id_numtoname(id2_num);k=lookup(id2_name);/檢查變量是否聲明if(k=0)err=2;errword=
50、id2_name;return;temp->result="-1"temp->op1=id1_name;temp->op2=id2_name;add_L_four(temp);/加一個四元式結(jié)點add_L_true(temp);/加一個true鏈結(jié)點L *temp2;temp2=new L;temp2->op="J"temp2->op1=" "temp2->op2=" "temp2->result="-1"add_L_four(temp2);/加一個四元
51、式結(jié)點add_L_false(temp2);/加一個false鏈結(jié)點if(m=13)/歸約Mid=Etemp->op="="temp->op1=E_name;temp->op2=" "id_name=id_numtoname(id_left);temp->result=id_name;add_L_four(temp);/加一個四元式結(jié)點yuyi_linshi=-1;/臨時變量開始重新計數(shù)if(m=14)/歸約Sif B then Mint a;a=id_then;temp=L_true_head->Ltrue;while(t
52、emp!=NULL)temp->result="L"+newop(a);a=temp->k;temp=temp->Ltrue;a=L_four_tail->k+1;temp=L_false_head->Lfalse;while(temp!=NULL)temp->result="L"+newop(a);temp=temp->Lfalse;L_true_head->Ltrue=NULL;L_false_head->Lfalse=NULL;/回填并清空true鏈和false鏈if(m=15)/歸約Swhil
53、e B do Mint a;a=id_do;temp=L_true_head->Ltrue;while(temp!=NULL)temp->result="L"+newop(a);a=temp->k;temp=temp->Ltrue;a=L_four_tail->k+2;temp=L_false_head->Lfalse;while(temp!=NULL)temp->result="L"+newop(a);temp=temp->Lfalse;L *temp1;temp1=new L;temp1->op=
54、"J"temp1->op1=" "temp1->op2=" "temp1->next=NULL;temp1->result="L"+newop(id_while);add_L_four(temp1);/加一個四元式結(jié)點L_true_head->Ltrue=NULL;L_false_head->Lfalse=NULL;/回填并清空true鏈和false鏈string newop(int m)/數(shù)字變成字符串int shang,yushu;string chuan,chuan1;shang=m;chuan=""w
溫馨提示
- 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)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 渤海石油職業(yè)學院《思想政治教育專業(yè)導(dǎo)論與創(chuàng)業(yè)基礎(chǔ)》2023-2024學年第一學期期末試卷
- 蘭州石化職業(yè)技術(shù)大學《應(yīng)用回歸分析》2023-2024學年第一學期期末試卷
- 貴州應(yīng)用技術(shù)職業(yè)學院《藥物分析》2023-2024學年第一學期期末試卷
- 漳州理工職業(yè)學院《食品質(zhì)量檢驗技術(shù)》2023-2024學年第一學期期末試卷
- 河南大學《國畫基礎(chǔ)》2023-2024學年第一學期期末試卷
- 長垣烹飪職業(yè)技術(shù)學院《世界現(xiàn)代設(shè)計史》2023-2024學年第一學期期末試卷
- 世界讀書節(jié)活動方案
- 天貓圣誕節(jié)活動策劃方案
- 天津公司宣傳片策劃方案
- 城市那達慕活動方案
- 通站(2017)8012 鐵路站場排水構(gòu)筑物
- 2024-2030年中國小型渦噴發(fā)動機行業(yè)競爭格局展望及投資策略分析報告
- UL2251標準中文版-2017電動汽車的插頭插座和耦合器UL中文版標準
- 網(wǎng)絡(luò)安全策略優(yōu)化方案
- 工程建筑勞務(wù)合作協(xié)議范本
- 房屋優(yōu)先購買權(quán)申請書
- 串標舉報信范文
- 留學銷售話術(shù)培訓
- 35kV電力線路遷改專項施工方案
- 110kV變電站施工組織總設(shè)計
- DB32T-中小學生健康管理技術(shù)規(guī)范 第1部分:心理健康編制說明
評論
0/150
提交評論