




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、精選優(yōu)質(zhì)文檔-傾情為你奉上黃岡師范學(xué)院提高型實驗報告實驗課題小型編譯程序(實驗類型:綜合性 設(shè)計性 應(yīng)用性)實驗課程編譯原理實驗時間 2010年 12 月 25 日學(xué)生姓名 許亞兵專業(yè)班級軟工0801學(xué) 號5一、實驗?zāi)康暮鸵蟊緦嶒炘O(shè)計的小型編譯程序涉及到編譯前端的三個階段:詞法分析、語法分析和語義分析生成中間代碼(四元式),編譯程序的重點放在中間代碼生成階段。編譯程序的輸出結(jié)果包括詞法分析后的二元式序列、變量名表;語法分析后的狀態(tài)棧分析過程顯示;語義分析生成中間代碼后的四元式程序。整個程序分為三個部分:(1) 詞法分析部分(2) 語法分析、語義分析及四元式生成部分(3) 輸出顯示部分二、實驗
2、條件 硬件環(huán)境:計算機一臺 軟件環(huán)境:WinTC.,windows系統(tǒng)三、原理分析與步驟1.詞法分析器設(shè)計詞法分析器的功能是輸入源程序,輸出單詞符號。我們規(guī)定輸出的單詞符號格式為如下的二元式:(單詞種別編碼,單詞自身的值)由于我們規(guī)定的程序語句中涉及單詞較少,故在詞法分析階段忽略了單詞輸入錯誤的檢查。1.1 單詞符號的內(nèi)部定義及在編譯程序中的定義我們對常量、變量、臨時變量、保留關(guān)鍵字(if、while、begin、end、else、then、do等)、關(guān)系運算符、邏輯運算符、分號、括號等,規(guī)定其內(nèi)部定義如下:符 號種別編碼說 明sy_if0保留字 ifsy_then1保留字 thensy_el
3、se2保留字 elsesy_while3保留字 whilesy_begin4保留字 beginsy_do5保留字 dosy_end6保留字 enda7賦值語句semicolon8“ ; ”e9布爾表達式Jinghao10“ # ”S11語句L12復(fù)合語句Tempsy15臨時變量EA18B and(即布爾表達式中的B)EO19B or(即布爾表達式中的B )Plus34“ + ”Times36“ * ”Becomes38“ := ” 賦值Op_and39“ and ”O(jiān)p_or40“ or ”O(jiān)p_not41“ not ”Rop42關(guān)系運算符Lparent48“ ( ”Rparent49“ )
4、”Ident56變量Intconst57整常量#include "stdio.h"/*如果使用TC的話,需要配置頭文件路徑*/#include "string.h"#define ACC -2/*/#define sy_if 0#define sy_then 1#define sy_else 2#define sy_while 3#define sy_begin 4#define sy_do 5#define sy_end 6#define a 7#define semicolon 8#define e 9#define jinghao 10#defin
5、e S 11#define L 12#define tempsy 15#define EA 18 /*E and*/#define E0 19 /E or*/#define plus 34#define times 36#define becomes 38#define op_and 39#define op_or 40#define op_not 41#define rop 42#define lparent 48#define rparent 49#define ident 56#define intconst 571.2 變量及數(shù)據(jù)結(jié)構(gòu)說明編譯程序中涉及到的變量及數(shù)據(jù)結(jié)構(gòu)說明如下:cha
6、r ch='0' /*從字符緩沖區(qū)讀取當前字符*/int count=0; /*詞法分析結(jié)果緩沖區(qū)計數(shù)器*/static char spelling10="" /*存放識別的字*/static char line81="" /*一行字符緩沖區(qū),最多80個字符*/char *pline; /*字符緩沖區(qū)指針*/static char ntab110010; /*變量名表,共100項,每項長度10*/struct ntabint tc; /*真值*/int fc; /*假值*/ntab2200; /*在布爾表達式E中保存有關(guān)布爾變量的真、假值
7、*/int label=0; /*指向ntab2的指針*/struct rwordschar sp10;int sy; /*保留字表的結(jié)構(gòu),用來與輸入緩沖區(qū)中的單詞進行匹配*/struct rwords reswords10="if",sy_if,"do",sy_do,"else",sy_else,"while",sy_while,"then",sy_then,"begin",sy_begin,"end",sy_end,"and",op
8、_and,"or",op_or,"not",op_not; /*保留字表初始化,大小為10*/struct aaint sy1; /*存放單詞的種別編碼*/int pos; /*存放單詞自身的值*/buf1000, /*詞法分析結(jié)果緩沖區(qū)*/n, /*讀取二元式的當前字符*/n1, /*當前表達式中的字符*/E, /*非終結(jié)符*/sstack100, /*算術(shù)或布爾表達式加工處理使用的符號棧*/ibuf100, /*算術(shù)或布爾表達式使用的緩沖區(qū)*/stack1000; /*語法分析加工處理使用的符號棧*/struct aa oth; /*四元式中的空白位
9、置*/struct fourexpchar op10;struct aa arg1;struct aa arg2;int result;fexp200; /*四元式的結(jié)構(gòu)定義*/int ssp=0; /*指向sstack棧指針*/struct aa *pbuf=buf; /*指向詞法分析緩沖區(qū)的指針*/int nlength=0; /*詞法分析中記錄單詞的長度*/int tt1=0; /*變量名表指針*/char *cfile; /*源程序文件,為結(jié)束符*/int lnum=0; /*源程序行數(shù)記數(shù)*/int sign=0; /*sign=1為賦值語句;=2為while語句;=3為if語句*/
10、*/int newt=0; /*臨時變量計數(shù)器*/int nxq=100; /*nxq總是指向下一個將要形成的四元式地址,*/*每次執(zhí)行g(shù)en()時,地址自動增1*/int lr; /*掃描LR分析表1過程中保存的當前狀態(tài)值*/int lr1; /*掃描LR分析表2或表3所保存的當前狀態(tài)值*/int sp=0; /*查找LR分析表時狀態(tài)棧的棧頂指針*/int stack1100; /*狀態(tài)棧1定義*/int sp1=0; /*狀態(tài)棧1的棧頂指針*/int num=0; /*算術(shù)或布爾表達式緩沖區(qū)指針*/struct llint nxq1; /*記錄下一條四元式的地址*/ int tc1; /*
11、真值鏈*/int fc1; /*假值鏈*/labelmark10; /*記錄語句嵌套層次的數(shù)組,*/*即記錄嵌套中每層的布爾表達式E的首地址*/int labeltemp10; /*記錄語句嵌套層次的數(shù)組,*/*即記錄每層else之前的四元式地址*/int pointmark=-1, /*labelmark數(shù)組指針*/pointtemp=-1; /*labeltemp數(shù)組指針*/1.3 主函數(shù)main()void main()cfile=fopen("pas.dat","r"); /*打開C語言源文件*/readch(); /*從源文件讀一個字符*/sc
12、an(); /*詞法分析*/disp1();disp3();stacksp.pos=0;stacksp.sy1=-1; /*初始化狀態(tài)棧*/stack1sp1=0; /*初始化狀態(tài)棧1*/oth.sy1=-1;printf("n* 狀態(tài)棧變化過程以及歸約順序 *n");readnu(); /*從二元式讀入一個符號*/lrparse(); /*語法語義分析產(chǎn)生四元式*/getch();disp2();printf("n程序運行結(jié)束!n");getch();1.4 詞法分析函數(shù)說明(1) 讀取函數(shù) readline( )、readch( )詞法分析包含從源文
13、件讀取字符的操作,但頻繁的讀文件會影響程序執(zhí)行效率,故實際上是從源程序文件“pas.dat”中讀取一行到輸入緩沖區(qū),而詞法分析過程中每次讀取一個字符時則是通過執(zhí)行readch()從輸入緩沖區(qū)獲得的;若緩沖區(qū)已被讀空,則再執(zhí)行readline()從pas.dat中讀取下一行至輸入緩沖區(qū)。/*從文件讀一行到緩沖區(qū)*/readline()char ch1;pline=line;ch1=getc(cfile); while(ch1!='n' && !feof(cfile)*pline=ch1;pline+;ch1=getc(cfile); *pline='0
14、39;pline=line;/*從緩沖區(qū)讀取一個字符*/readch()if(ch='0')readline();lnum+;ch=*pline;pline+;(2) 掃描函數(shù) scan( )掃描函數(shù)scan()的功能是濾除多余空格并對主要單詞進行分析處理,將分析得到的二元式存入二元式結(jié)果緩沖區(qū)。/*掃描主函數(shù)*/scan()int i;while(ch!='') /*是源程序結(jié)束符號*/switch(ch)case ' ':break;case 'a' :case 'b' :case 'c' :c
15、ase 'd' :case 'e' :case 'f' :case 'g' :case 'h' :case 'i' :case 'j' :case 'k' :case 'l' :case 'm' :case 'n' :case 'o' :case 'p' :case 'q' :case 'r' :case 's' :case 't
16、39; :case 'u' :case 'v' :case 'w' :case 'x' :case 'y' :case 'z' : /*保留字和標識符中的字母只能是小寫字母*/identifier(); /*識別保留字和標識符*/break;case '0' :case '1' :case '2' :case '3' :case '4' :case '5' :case '6' :case
17、'7' :case '8' :case '9' :number(); /*識別整常數(shù)*/break;case '<' :readch();if(ch='=')bufcount.pos=0; /*識別<=*/elseif(ch='>') bufcount.pos=4; /*識別<>*/elsebufcount.pos=1; /*識別<*/pline-;bufcount.sy1=rop; /*識別關(guān)系運算符*/count+;break;case '>
18、39; :readch();if(ch='=')bufcount.pos=2; /*識別>=*/elsebufcount.pos=3; /*識別>*/pline-;bufcount.sy1=rop; /*識別關(guān)系運算符*/count+;break;case '(' :bufcount.sy1=lparent; /*識別(*/count+;break;case ')' :bufcount.sy1=rparent; /*識別)*/count+;break;case '#' :bufcount.sy1=jinghao; /*
19、識別#*/count+;break;case '+' :bufcount.sy1=plus; /*識別+*/count+;break;case '*' :bufcount.sy1=times; /*識別*/count+;break;case ':' :readch();if(ch='=')bufcount.sy1=becomes; /*識別:=*/count+;break;case '=' :bufcount.sy1=rop;bufcount.pos=5; /*識別=,關(guān)系算符*/count+;break;case
20、 '' :bufcount.sy1=semicolon; /*識別;*/count+;break;readch();bufcount.sy1=-1; /*不可識別的符號*/(3) 變量處理及變量名表 find( )變量處理中首先把以字母開頭的字母數(shù)字串存到spelling10數(shù)組中,然后進行識別。識別過程是先讓它與保留關(guān)鍵字表中的所有關(guān)鍵字進行匹配,若獲得成功則說明它為保留關(guān)鍵字,即將其內(nèi)碼值寫入二元式結(jié)果緩沖區(qū);否則說明其為變量,這時讓它與變量名表中的變量進行匹配(變量匹配函數(shù)find(),如果成功,則說明該變量已存在并在二元式結(jié)果緩沖區(qū)中標記為此變量(單詞自身值填為該變量在
21、變量名表中的位置),否則將該變量登記到變量名表中,再將這個新變量存入二元式緩存數(shù)組中。/* 變量匹配,查找變量名表 */find(char spel)int ss1=0;int ii=0;while(ss1=0)&&(ii<nlength)if(!strcmp(spel,ntab1ii) ss1=1; /*查找,匹配*/ii+;if(ss1=1) return ii-1; /*查找到*/else return -1; /*沒查找到*/*標識符和保留字的識別*/identifier()int iii=0,j,k;int ss=0;k=0;dospellingk=ch;k+;
22、readch();while(ch>='a')&&(ch<='z')|(ch>='0')&&(ch<='9');pline-;spellingk='0'while(ss=0)&&(iii<10)if(!strcmp(spelling,reswordsiii.sp) ss=1; /*保留字匹配*/iii+;if(ss=1)bufcount.sy1=reswordsiii-1.sy; /*是保留字*/elsebufcount.sy1=iden
23、t; /*是標識符,變量名*/j=find(spelling);if(j=-1) /*沒有在變量名表中則添加*/bufcount.pos=tt1; /*tt1是變量名表指針*/strcpy(ntab1tt1,spelling);tt1+;nlength+;else bufcount.pos=j; /*獲得變量名自身的值*/count+;for(k=0;k<10;k+) spellingk='' /*清空單詞符號緩沖區(qū)*/(4) 數(shù)字識別 number( )數(shù)字識別將識別出的數(shù)字轉(zhuǎn)換為等值的十進制數(shù)值并填入二元式結(jié)果緩存數(shù)組。/*數(shù)字識別*/number()int ival
24、ue=0;int digit;dodigit=ch-'0'ivalue=ivalue*10+digit; /*數(shù)字字符轉(zhuǎn)換為十進制整常數(shù)*/readch();while(ch>='0')&&(ch<='9');bufcount.sy1=intconst; /*整常數(shù)單詞符號二元式*/bufcount.pos=ivalue;count+;pline-;(5) 顯示函數(shù)顯示函數(shù)的功能是在屏幕上輸出詞法分析的結(jié)果(即二元式序列和變量名表),同時給出二元式個數(shù)及源程序行數(shù)統(tǒng)計。/* 顯示詞法分析結(jié)果:單詞符號二元式 */dis
25、p1()int temp1=0;printf("n* 詞法分析結(jié)果 *n");for(temp1=0;temp1<count;temp1+)printf("%dt%dn",buftemp1.sy1,buftemp1.pos);if(temp1=20)printf("Press any key to continue.n");getch();getch();/* 打印變量名表 */void disp3()int tttt;printf("nn程序總共%d行,產(chǎn)生了%d個二元式!n",lnum,count);ge
26、tch();printf("n* 變量名表 *n");for(tttt=0;tttt<tt1;tttt+)printf("%dt%sn",tttt,ntab1tttt);getch();2.語法語義分析器設(shè)計語法語義分析器的核心是描述程序語句、算術(shù)表達式、布爾表達式語法分析的三張LR分析表以及針對這三張LR分析表進行語義加工的語義動作。編譯程序中語法分析處理及四元式生成部分主要是以二元式作為輸入,并且通過LR分析表對語法分析處理過程進行控制,使四元式翻譯的工作有條不紊的進行,同時識別語法分析中的語法錯誤。在處理if和while語句時,需要進行真值或
27、假值的拉鏈和回填工作,以便轉(zhuǎn)移目標的正確填入。2.1 LR分析表及實現(xiàn)(1)程序語句的文法及LR分析表實現(xiàn)程序語句的文法GS如下:Sif e then S else S|while e do S|begin L end|aLS;L|S在本小型編譯程序的設(shè)計與實現(xiàn)中,我們將賦值語句與算術(shù)表達式歸為一類處理,故在此處將賦值語句僅看作為程序語句文法中的一個終結(jié)符號a,將布爾表達式也看作終結(jié)符號e。將文法GS拓廣為GS:(0) SS(1) Sif e then S else S(2) Swhile e do S(3) Sbegin L end(4) Sa(5) LS(6) LS;L由此得到程序語句LR
28、分析的SLR(1)分析表如下:狀態(tài)ACTIONGOTOifthenelsewhilebegindoenda;e#SL0s2s3s4s511acc2s63s74s2s3s4s5985r4r4r4r46s107s118s129r5s1310s2s3s4s51411s2s3s4s51512r3r3r3r313s2s3s4s591614s1715r2r2r2r216r617s2s3s4s51818r1r1r1r1在小型編譯程序中程序語句的SLR(1)分析表設(shè)計如下:/* 程序語句的LR分析表 */static int action1913= /*0*/ 2, -1, -1, 3, 4, -1, -1,
29、 5, -1, -1, 10, 1, -1 ,/*1*/ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ACC, -1, -1 ,/*2*/ -1, -1, -1, -1, -1, -1, -1, -1, -1, 6, -1, -1, -1 ,/*3*/ -1, -1, -1, -1, -1, -1, -1, -1, -1, 7, -1, -1, -1 ,/*4*/ 2, -1, -1, 3, 4, -1, -1, 5, -1, -1, -1, 9, 8 ,/*5*/ -1, -1,104, -1, -1, -1,104, -1,104, -1, 104, -
30、1, -1 ,/*6*/ -1, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 ,/*7*/ -1, -1, -1, -1, -1, 11, -1, -1, -1, -1, -1, -1, -1 ,/*8*/ -1, -1, -1, -1, -1, -1, 12, -1, -1, -1, -1, -1, -1 ,/*9*/ -1, -1, -1, -1, -1, -1,105, -1, 13, -1, -1, -1, -1 ,/*10*/ 2, -1, -1, 3, 4, -1, -1, 5, -1, -1, -1, 14, -1 ,/*11*/
31、 2, -1, -1, 3, 4, -1, -1, 5, -1, -1, -1, 15, -1 ,/*12*/ -1, -1,103, -1, -1, -1,103, -1,103, -1, 103, -1, -1 ,/*13*/ 2, -1, -1, 3, 4, -1, -1, 5, -1, -1, -1, 9, 16 ,/*14*/ -1, -1, 17, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 ,/*15*/ -1, -1,102, -1, -1, -1,102, -1,102, -1, 102, -1, -1 ,/*16*/ -1, -1, -1,
32、 -1, -1, -1,106, -1, -1, -1, -1, -1, -1 ,/*17*/ 2, -1, -1, 3, 4 ,-1, -1, 5, -1, -1, -1, 18, -1 ,/*18*/ -1, -1,101, -1, -1, -1,101, -1,101, -1, 101, -1, -1 ;其中前11列為action值,后2列為goto值;018表示19個移進狀態(tài)(即Sj);-1表示出錯;acc表示分析成功;而100106對應(yīng)7個歸約產(chǎn)生式:100: SS101: S if e then S else S e是布爾表達式,看作終結(jié)符號102: S while e do S
33、103: S begin L end104: S a a是賦值語句,看作終結(jié)符號105: L S106: L S;L(2) 算術(shù)表達式的LR分析表實現(xiàn)算術(shù)表達式的文法GE如下:EE+E|E*E|(E)|i將文法GE拓廣為GS(0) SE(1) E E+E(2) E E*E(3) E (E)(4) E i由此得到算術(shù)表達式LR分析的SLR(1)分析表如下:狀態(tài)ACTIONGOTOi+*()#E0s3s211s4s5acc2s3s263r4r4r4r44s3s275s3s286s4s5s97r1s5r1r18r2r2r2r29r3r3r3r3編譯程序中算術(shù)表達式的SLR(1)分析表設(shè)計如下:/*
34、算術(shù)表達式的LR分析表 */static int action1107=/*0*/ 3, -1, -1, 2, -1, -1, 1 ,/*1*/ -1, 4, 5, -1, -1,ACC, -1 ,/*2*/ 3, -1, -1, 2, -1, -1, 6 ,/*3*/ -1,104,104, -1,104,104, -1 ,/*4*/ 3, -1 ,-1, 2, -1, -1, 7 ,/*5*/ 3, -1, -1, 2, -1, -1, 8 ,/*6*/ -1, 4, 5, -1, 9, -1, -1 ,/*7*/ -1, 101, 5, -1,101,101 ,-1 ,/*8*/ -1,
35、 102,102,-1,102,102, -1 ,/*9*/ -1, 103,103,-1,103,103, -1 ;其中前6列為action值,后1列為goto值; 09表示10個移進狀態(tài)(即Sj);-1表示出錯;ACC表示分析成功;而100104對應(yīng)5個歸約產(chǎn)生式:100: SE101: E E + E102: E E * E103: E ( E )104: E i(3) 布爾表達式的LR分析表實現(xiàn)布爾表達式的文法GB如下:BBB|BB|ØB|(B)|i rop i | i 為了便于語法分析時的加工處理,將上述文法改寫為文法GS:BBAB|BOB|ØB|(B)|i ro
36、p i | i BABBOB將文法GS拓廣為文法GS(0) SB (1) B i (2) B i rop i (3) B (B) (4) B not B(5) A B and(6) B AB(7) O B or(8) B OB由此得到算術(shù)表達式LR分析的SLR(1)分析表如下:狀態(tài)ACTIONGOTOirop()notandor#BAO0s1s4s513781s2r1r1r1r12s33r2r2r2r24s1s4s511785s1s4s56786r1s9s10r47s1s4s514788s1S4S515789r5r5r510r7r7r711s12s9s1012r3r3r3r313s9s10ac
37、c14r6s9s10r615r8s9s10r8編譯程序中布爾表達式LR分析的SLR(1)分析表設(shè)計如下:/* 布爾表達式的LR分析表 */static int action21611=/*0*/ 1, -1, 4, -1, 5, -1, -1, -1, 13, 7, 8 ,/*1*/ -1, 2, -1,101, -1,101,101,101, -1, -1, -1 ,/*2*/ 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 ,/*3*/ -1, -1, -1,102, -1,102,102,102, -1, -1, -1 ,/*4*/ 1, -1, 4,
38、 -1, 5, -1, -1, -1, 11, 7, 8 ,/*5*/ 1, -1, 4, -1, 5, -1, -1, -1, 6, 7, 8 ,/*6*/ -1, -1, -1,104, -1, 9, 10,104, -1, -1, -1 ,/*7*/ 1, -1, 4, -1, 5, -1, -1, -1, 14, 7, 8 ,/*8*/ 1, -1, 4, -1, 5, -1, -1, -1, 15, 7, 8 ,/*9*/ 105, -1,105, -1,105, -1, -1, -1, -1, -1, -1 ,/*10*/ 107, -1,107, -1,107, -1, -1,
39、-1, -1, -1, -1 ,/*11*/ -1, -1, -1, 12, -1, 9, 10, -1, -1, -1, -1 ,/*12*/ -1, -1, -1,103, -1,103,103,103, -1, -1, -1 ,/*13*/ -1, -1, -1, -1, -1, 9, 10,acc, -1, -1, -1 ,/*14*/ -1, -1, -1,106, -1, 9, 10,106, -1, -1, -1 ,/*15*/ -1, -1, -1,108, -1, 9, 10,108, -1, -1, -1 ;其中前8列為action值,后3列為goto值; 015表示16個
40、移進狀態(tài)(即Sj);-1表示出錯;acc表示分析成功;而100108對應(yīng)9個歸約產(chǎn)生式:100: SB101: B i102: B i rop i 103: B ( B )104: B not B105: A B and106: B AB107: O B or108: B OB2.2 算術(shù)表達式處理的語義加工程序根據(jù)算術(shù)表達式文法中產(chǎn)生式對應(yīng)的語義動作,相應(yīng)的加工處理程序如下:/* 賦值語句和算術(shù)表達式的分析 */lrparse1(int num) int lr1;lr1=action1stack1sp1change1(n1.sy1);if(lr1=-1)printf("n算術(shù)表示式
41、或賦值語句出錯!n");getch();exit(0);if(lr1<10)&&(lr1>=0) /*當前查找LR分析表中的狀態(tài)為移進狀態(tài)*/sp1+;stack1sp1=lr1;if(n1.sy1!=tempsy)ssp+;num+;sstackssp.sy1=n1.sy1; /*將變量名壓棧*/sstackssp.pos=n1.pos; /*將變量名地址壓棧*/n1.sy1=ibufnum.sy1;n1.pos=ibufnum.pos;lrparse1(num);if(lr1>=100)&&(lr1,105) /*當前查找LR分析
42、表中的狀態(tài)為歸約狀態(tài)*/switch(lr1)case 100: /* SE */break;case 101: /* EE+E */E.pos=newtemp();gen("+",sstackssp-2,sstackssp,E.pos+100);ssp=ssp-2;sstackssp.sy1=tempsy;sstackssp.pos=E.pos;sp1=sp1-3;break;case 102: /* EE*E */E.pos=newtemp();gen("*",sstackssp-2,sstackssp,E.pos+100);ssp=ssp-2;ss
43、tackssp.sy1=tempsy;sstackssp.pos=E.pos;sp1=sp1-3; /* EE+E產(chǎn)生式右部長度為3,故歸約后棧指針減3 */break;case 103: /* E(E) */E.pos=sstackssp-1.pos;ssp=ssp-2;sstackssp.sy1=tempsy;sstackssp.pos=E.pos;sp1=sp1-3;break;case 104: /* Ei */E.pos=sstackssp.pos;sp1-;break;n1.sy1=tempsy; /* 歸約后為非終結(jié)符*/n1.pos=E.pos;lrparse1(num);if
44、(lr1=ACC)&&(stack1sp1=1) /*賦值語句Ai:= E的歸約*/gen(":=",sstackssp,oth,ibuf0.pos);ssp=ssp-3;sp1=sp1-3;2.3 布爾表達式處理的語義加工程序根據(jù)布爾表達式文法中產(chǎn)生式對應(yīng)的語義動作,相應(yīng)的加工處理程序如下:lrparse2(int num)int templabel;lr1=action2stack1sp1change2(n1.sy1);if(lr1=-1)if(sign=2) printf("nwhile語句出錯!n");if(sign=3) pri
45、ntf("nif語句出錯!n");getch();exit(0);if(lr1<16)&&(lr1>=0) /*當前查找LR分析表中的狀態(tài)為移進狀態(tài)*/sp1+;stack1sp1=lr1;ssp+;sstackssp.sy1=n1.sy1;sstackssp.pos=n1.pos;if(n1.sy1!=tempsy)&&(n1.sy1!=EA)&&(n1.sy1!=E0) num+;n1.sy1=ibufnum.sy1;n1.pos=ibufnum.pos;lrparse2(num);if(lr1>=100)&&(lr1<109) /*當前查找LR分析表中的狀態(tài)為歸約狀態(tài)*/switch(lr1)case 100: /* S B *
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 智能配電網(wǎng)的智能管理-洞察及研究
- 智能風(fēng)險預(yù)警與應(yīng)急響應(yīng)系統(tǒng)-洞察及研究
- 江蘇省揚州市邗江區(qū)三校2025年高一下化學(xué)期末調(diào)研試題含解析
- 色素分子結(jié)構(gòu)與功能-洞察及研究
- 農(nóng)業(yè)保險風(fēng)險管理-洞察及研究
- 全球化背景下體育市場營銷模式-洞察闡釋
- 山西省大同市平城區(qū)第一中學(xué)2025屆化學(xué)高一下期末質(zhì)量跟蹤監(jiān)視試題含解析
- 跨境網(wǎng)絡(luò)安全治理成本-洞察闡釋
- 航空認知無線電中的智能頻譜預(yù)約技術(shù)-洞察闡釋
- 匯率變動與國內(nèi)通脹壓力傳導(dǎo)-洞察及研究
- 起重機司機Q2(限橋式起重機)題庫題庫(1727道)
- 第九章 西半球的國家 單元教學(xué)設(shè)計-2023-2024學(xué)年七年級地理下學(xué)期人教版
- 云南錫業(yè)職業(yè)技術(shù)學(xué)院《影視劇配音》2023-2024學(xué)年第一學(xué)期期末試卷
- 2025年遼寧沈陽地鐵集團有限公司招聘筆試參考題庫含答案解析
- 體檢中心接待規(guī)范流程
- 夏季食堂食品安全注意事項
- 2025年全國水務(wù)集團招聘筆試參考題庫含答案解析
- 知識產(chǎn)權(quán)合規(guī)管理體系解讀
- JJF(陜) 035-2020 雨滴譜式降水現(xiàn)象儀現(xiàn)場校準規(guī)范
- 阿細跳月課件
- 科研倫理與學(xué)術(shù)規(guī)范(研究生)期末試題
評論
0/150
提交評論