編譯原理實驗教案_第1頁
編譯原理實驗教案_第2頁
編譯原理實驗教案_第3頁
編譯原理實驗教案_第4頁
編譯原理實驗教案_第5頁
已閱讀5頁,還剩45頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、編譯原理實驗教案授課教師:程細才適用專業(yè):計算機科學與技術使用班級:04計算機科學與技術八2班授課時間:2007年春季授課學時:54/44/10學時使用教材:編譯原理華中科技大學出版社何炎祥主編實驗指導書:編譯原理實驗指導書,黃石理工學院計算機學院實驗教學進度表周 次日期實驗課題學 時實驗報 告次數105.8-5.12實驗一 C諦言子集編譯程 序20115.15-5.19實驗一 C諦言子集編譯程 序20125.22-5.26實驗一 C諦言子集編譯程 序21135.29-6.2實驗二 LEX詞法分析程序 生成器21146.5-6.9實驗三 YACC®法分析程序 生成器21實驗一 C語言

2、子集編譯程序一、實驗目的用c語言對一個c語言的子集編制一個一遍掃描的編譯程序,以加深對編譯原理的理解,掌握編譯程序的實現方法和技術。1 .設計、編制并調試一個詞法分析程序,加深對詞法分析原理的理解。2 .編制一個遞歸下降分析程序,并對C語言的簡單子集進行分析。3 .通過上機實習,加深對語法制導翻譯原理的理解,掌握將語法分析所識別的語法成分變換中間代碼的語義翻譯方法。二、實驗要求、內容及學時詞法分析部分:2學時(一)待分析的C語言子集的詞法:1 .關鍵字main if else int return void while所有關鍵字都是小寫。2 .專用符號=+ - * / < <= &

3、gt; >= = != ; :, ()3 .其他標記ID和NUM通過以下正規(guī)式定義其他標記:ID 一 letter(letter|digit) *NUM» digit(digit)*letter - a| 憶冏 |Z digit - 0| 一|94 .空格由空白、制表符和換行符組成空格一般用來分隔ID、NUM專用符號和關鍵字,詞法分析階段空格通常被忽略。各種單詞符號對應的類別碼:(采用一符一類別碼,見下表)單詞符號類別碼單詞符號類別碼單詞符號類別碼main1-23;34int2*24>35char3/25<36if4(26>=37else5)27<=38

4、for628=39while729!=40ID1030'0 '1000NUM2031ERROR-1=2132+22:33(二)詞法分析程序的功能:輸入:所給文法的源程序字符串。輸出:二元組(syn,token或sum)構成的序列。其中,syn為單詞類別碼。token為存放的單詞自身字符串。sum為整型常量。具體實現時,可以將單詞的二元組用結構進行處理。例如:對源程序main()int i=10;while(i) i=i-1;的源文件,經詞法分析后輸出如下序列:(1,main) (26,() (27,) (30,)(2,int) (10,i) (21,=) (20,10)(34,

5、;) (7,while) (26,() (10,i) (27,) (10,i) (21,=) (10,i)(23,-) (20,1) (34,;) (31,)(三)詞法分析程序主要算法思想:算法的基本任務是從字符串表示的源程序中識別出具有獨立意義的單詞符號,其基本思想是根據掃描到單詞符號的第一個字符的種類,拼出相應的單詞符號。1 .主程序示意結構圖(如下):置初值調用掃描子程序輸出單詞二元組直至輸入串結束關鍵字表初值關鍵字作為特殊標識符處理,把它們預先安排在一張表格中(稱為關鍵 字),當掃描程序識別出標識符時,查關鍵字表。如能查到匹配的單詞,則 該單詞為關鍵字,否則為一般標識符。關鍵字表可處理

6、為一個字符串數組(實 際為指向字符數組的指針數組),其描述如下:char *KEY_WORDS8=main , int , char , if , else , for , while ;為分析方便,這里把main作關鍵字處理。程序中需要用到的主要變量:syn,token和surnu2 .掃描子程序(scaner)的算法思想首先設置三個變量:token用來存放構成單詞符號的字符串; sum用來 存放整型單詞;syn用來存放單詞的類別碼。掃描子程序主要部分NHS圖如下:變量初始化忽略空格文件是否結束TF是否字母TF拼字符串是否數字是否關鍵字TFTF拼數是否運算符、界符等符號syn為對應關鍵 字的

7、類別碼syn=10syn=20TF給出相應的syn值報錯語法分析部分:2學時(一)待分析的 C語言子集的語法用擴充的BNF表示如下:1. 程序 a main()語句塊2. 語句塊一'語句串''3. 語句串 一語句;語句;4. 語句 a 賦值語句|條件語句|循環(huán)語句5. 賦值語句-ID=表達式6. 條件語句-if(條件表達式 ) 語句塊7. 循環(huán)語句-while(條件表達式 )語句塊8. 條件表達式 一表達式 關系運算符 表達式9. 表達式 一項+項|-項10. 項一項*因子|/因子11. 因子 a ID|NUM|( 表達式 )12. 關系運算符 |=|=|=|!=(二)

8、語法分析程序的主要算法思想1 .主程序結構示意圖如下:置初值調用scaner讀下一個單詞符號調用 Irparser結束2 .遞歸下降分析程序結構示意圖如下:注:上接 Irparser是否單詞串main()TF調用scaner出錯處理調用語句塊分析函數源程序是否結束TF輸出分析成功出錯處理3.語句塊分析結構示意圖。是否TF調用scaner出錯處理調用語句串分析函數(過程)是否TF出錯處理4.語句串分析結構示意圖如下:調用statement 函數當為;時調用scaner調用statement 函數出錯處理5. statement函數N S圖如下:是否標識符TF調用scaner是否if是否二TFTF

9、調用scaner是否while調用scaner出錯處理調用 conditionTF調用 expression調用語句塊調用scaner出錯 處理調用 condition調用語句塊6. expression 函數結構示意圖如下:調用term是否+、-TF調用scaner出錯處理調用term7. term函數結構示意圖如下:調用factor是否*、/TF調用scaner出錯處理調用factor8.condition函數結構示意圖如下:調用 expression是否邏輯運算符TF調用scaner出錯處理調用 expression9. factor函數結構示意圖如下:是否標識符TF調用scaner是否

10、數字TF調用scaner是否(TF調用scaner出錯處理調用 expression是否)TF調用scaner出錯處理語義分析部分:2學時(一)實驗的輸入和輸出輸入是語法分析提供的正確的單詞串,輸出是四元式序列。例如,對于語句串i=2*3+4;if(i>10) j=3;while(j>0) k=1;輸出的四元式序列如下:1:*,2,3,T12:+,T1,4,T23:=,T2,i 4:j>, i, 10, 65:j,76:=,3,j7:j>,j,0,98:j,119:=,1,k10:j,7(二)算法思想1 .設置語義過程 int gen(op,arg1,arg2,resu

11、lt)該函數是將四元式(op,arg1,arg2,result)送到四元式表中。 char *newtemp()該函數回送一個新的臨時變量名,臨時變量名產生的順序為:T1,T2, int merg(p1,p2)該函數將以p1和p2為頭指針的兩條鏈合并為一,合并后的鏈表首為返回值。 int bp(p,t)該函數的功能是把 p所鏈接的每個四元式的第四區(qū)段都填為to2 .主程序示意圖如下:置初值調用scaner調用 lrparser打印四元式列表 結束3函數lrparse 在原來語法分析的基礎上插入相應的語義動作。將輸入串翻譯成四元式序列。在實驗中我們只對表達式、 if 語句 和 while 語句進

12、行翻譯,其具體翻譯程序見實例。算符優(yōu)先分析法部分: (選作)算符優(yōu)先分析法特別有利于表達式的處理, 宜于手工實現。 算符優(yōu)先分析過程是自下而上的歸約過程,但這種歸約未必是嚴格的規(guī)范歸約。因此,所謂算符優(yōu)先分析法就是定義算符之間的某種優(yōu)先關系, 并借助這種關系尋找句型的最左素短語進行歸約。算符優(yōu)先分析法通常有兩種: 優(yōu)先矩陣法和優(yōu)先函數法。 前者是提供一張算符優(yōu)先關系表, 后者提供兩個優(yōu)先函數 (入棧優(yōu)先函數f 和比較優(yōu)先函數 g ) ,優(yōu)先函數法比優(yōu)先矩陣法節(jié)約存儲空間,所以較為普遍。下面介紹使用優(yōu)先函數法的分析過程。分析過程:先在算符棧置“$” ,然后開始順序掃描表達式。若讀來的單詞符號是操

13、作數, 則直接進操作數棧, 然后繼續(xù)下一個單詞符號。 分析過程從頭開始,并重復進行;若讀來的單詞符號是運算符2 ,則將當前處于運算符棧頂的運算符1 的入棧優(yōu)先函數 f 與 2 的比較優(yōu)先函數 g 進行比較。1若f ( 1 ) g( 2 ) ,則 2 進算符棧,并繼續(xù)順序往下掃描,分析過程重復進行。2若f ( 1) g( 2) ,則產生對操作數棧頂的若干項進行1 運算的中間代碼,并從運算符棧頂移去1 ,且從操作數棧頂移去相應若干項,然后把執(zhí)行 1 運算的結果壓入操作數棧。接著以運算符棧新的項與 2 進行上述比較。3重復步驟1, 2,直到“$ ”和“$ ”配對為止。三、實驗環(huán)境DOS或或Windo

14、ws操作系統(tǒng)TURBO C 2.0 或 Visual C+四、實驗參考(參考代碼)#ifndef _GLOBALS_H#include<stdio.h>#include<stdlib.h>#include<string.h># define _SYN_MAIN 1# define _SYN_INT 2# define _SYN_CHAR 3# define _SYN_IF4# define _SYN_ELSE5# define _SYN_FOR6# define _SYN_WHILE7# define _SYN_ID10# define _SYN_NUM20

15、# define _SYN_ASSIGN 21# define _SYN_PLUS22# define _SYN_MINUS23# define _SYN_TIMES24# define _SYN_DIVIDE25# define _SYN_LPAREN26# define _SYN_RPAREN27# define _SYN_LEFTBRACKET1 28# define _SYN_RIGHTBRACKET1 29# define _SYN_LEFTBRACKET2 30#define _SYN_RIGHTBRACKET2 31# define _SYN_COMMA32# define _S

16、YN_COLON33# define _SYN_SEMICOLON 34# define _SYN_LG35# define _SYN_LT36# define _SYN_ME37# define _SYN_LE38# define _SYN_EQ39# define _SYN_NE40# define _SYN_END1000#define _SYN_ERROR-1#define MAXLENGTH255#ifndef _SEMANTEM_H#define _SEMANTEM_H/* 四元組的結構 */typedef struct QUADchar opMAXLENGTH;/*操作符 */c

17、har argv1MAXLENGTH;/*第一個操作數*/char argv2MAXLENGTH;/* 第二個操作數*/char resultMAXLENGTH;/* 運算結果 */QUATERNION;void lrparse(void);/* 語法語義分析主函數 */#endifunion WORDCONTENTchar T1MAXLENGTH;int T2;char T3;typedef struct WORDint syn;union WORDCONTENT value;WORD;#ifndef _SCAN_H#define _SCAN_H#define _TAB_LEGNTH 4#d

18、efine _KEY_WORD_END "waiting for youexpanding"void Scaner(void);#endifQUATERNION *pQuad;int nSuffix,nNXQ,ntc,nfc;extern WORD uWord;extern int gnColumn,gnRow;FILE *fw;char *str;char *strSource;char *Expression(void);char *Term(void);char *Factor(void);void Statement_Block(int *nChain);/*FIL

19、E *Source;*/FILE *fw;char *strSource;void Do_Tag(char *strSource);void Do_Digit(char *strSource);void Do_EndOfTag(char *strSource);void Do_EndOfDigit(char *strSource);void Do_EndOfEqual(char *strSource);void Do_EndOfPlus(char *strSource);void Do_EndOfSubtraction(char *strSource);void Do_EndOfMultipl

20、y(char *strSource);void Do_EndOfDivide(char *strSource);void Do_EndOfLParen(char *strSource);void Do_EndOfRParen(char *strSource);void Do_EndOfLeftBracket1(char *strSource);void Do_EndOfRightBracket1(char *strSource);void Do_EndOfLeftBracket2(char *strSource);void Do_EndOfRightBracket2(char *strSour

21、ce);void Do_EndOfColon(char *strSource);void Do_EndOfComma(char *strSource);void Do_EndOfSemicolon(char *strSource);void Do_EndOfMore(char *strSource);void Do_EndOfLess(char *strSource);void Do_EndOfEnd(char *strSource);void PrintWord(WORD uWord);void ApartWord(char *strSource);void PrintError(int n

22、Column,int nRow,charchInput);void Scaner(void);int gnColumn,gnRow,gnLocate,gnLocateStart;WORD uWord;char*KEY_WORDS20="main","int","char","if","el se","for","while","void",_KEY_WORD_END;int IsDigit(char chInput)/ 判斷掃描的字符是

23、否數字if(chInput<='9'&&chInput>='0') return 1;else return 0;int IsChar(char chInput)/ 判斷掃描的字符是否字母if(chInput<='z'&&chInput>='a')|(chInput<='Z'&&chInput>='A')return 1;else return 0;void Do_Start(char *strSource)/ 開始

24、識別一個單詞gnLocateStart=gnLocate;switch(strSourcegnLocate)case '+': Do_EndOfPlus(strSource);break;case '-': Do_EndOfSubtraction(strSource);break;case '*': Do_EndOfMultiply(strSource);break;case '/': Do_EndOfDivide(strSource);break;case '(': Do_EndOfLParen(strSourc

25、e);break;case ')': Do_EndOfRParen(strSource);break;case '': Do_EndOfLeftBracket1(strSource);break;case '': Do_EndOfRightBracket1(strSource); break;case '': Do_EndOfLeftBracket2(strSource); break;case '': Do_EndOfRightBracket2(strSource);break;case ':':

26、 Do_EndOfColon(strSource);break;case ',': Do_EndOfComma(strSource);break;case '': Do_EndOfSemicolon(strSource);break;case '>': Do_EndOfMore(strSource);break;case '<': Do_EndOfLess(strSource);break;case '=': Do_EndOfEqual(strSource);break;case '0'

27、: Do_EndOfEnd(strSource);break;default:if(IsChar(strSourcegnLocate)Do_Tag(strSource);elseif(IsDigit(strSourcegnLocate) uWord.value.T2=strSourcegnLocate-'0'Do_Digit(strSource);elseif(strSourcegnLocate!=' '&&strSourcegnLocate!='n&&strSourcegnLocate!='r')Prin

28、tError(gnColumn,gnRow,strSourcegnLoc ate);if(strSourcegnLocate='n'|strSourcegnLocate='r')gnColumn+;gnRow=1; elseif(strSourcegnLocate='t')gnColumn+=_TAB_LEGNTH;elsegnRow+;gnLocate+;Do_Start(strSource);break;return;void Do_Tag(char *strSource)/ 識別標識符的中間狀態(tài)gnLocate+;gnRow+;if(IsC

29、har(strSourcegnLocate)|IsDigit(strSourcegnLocate)Do_Tag(strSource);elseDo_EndOfTag(strSource);return;void Do_Digit(char *strSource)/ 識別整數的中間狀態(tài)gnLocate+;gnRow+;if(IsDigit(strSourcegnLocate)uWord.value.T2=uWord.value.T2*10+strSourc egnLocate-'0'Do_Digit(strSource);else Do_EndOfDigit(strSource)

30、;return;void Do_EndOfTag(char *strSource)/ 識別標識符的最后狀態(tài)int nLoop;uWord.syn=_SYN_ID;strncpy(uWord.value.T1,strSource+gnLocate Start,gnLocate-gnLocateStart);0'nLoop=0;while(strcmp(KEY_WORDSnLoop,_KEY_WORD_END)if(!strcmp(KEY_WORDSnLoop,uWord.value.T1)uWord.syn=nLoop+1;nLoop+;return;void Do_EndOfDigit

31、(char *strSource)/ 識別數的最后狀態(tài)uWord.syn=_SYN_NUM;return;void Do_EndOfEqual(char *strSource)/ 識別 =的最后狀態(tài),它的開始狀態(tài)在 Do_Start 中已處理,/ 運算符沒有中間狀態(tài), 因為最多由兩個符號組成,/ 而數和標識符可以由多個終結符組成。/ 以下類似的函數命名,其功能類似,不再加注。/ 以下如: +, - , * , / , (, 0, , , , , : ,逗號,if(strSourcegnLocate+1!='=')uWord.syn=_SYN_ASSIGN;uWord.value

32、.T3=strSourcegnLocate;elsegnLocate+;gnRow+;uWord.syn=_SYN_EQ;strcpy(uWord.value.T1,"=");gnLocate+;gnRow+;return; void Do_EndOfPlus(char *strSource) uWord.syn=_SYN_PLUS;uWord.value.T3=strSourcegnLocate;gnLocate+;gnRow+;return;void Do_EndOfSubtraction(char *strSource)uWord.syn=_SYN_MINUS;uWo

33、rd.value.T3=strSourcegnLocate;gnLocate+;gnRow+;return;void Do_EndOfMultiply(char *strSource)uWord.syn=_SYN_TIMES;uWord.value.T3=strSourcegnLocate;gnLocate+;gnRow+;return;void Do_EndOfDivide(char *strSource)uWord.syn=_SYN_DIVIDE;uWord.value.T3=strSourcegnLocate;gnLocate+;gnRow+;return;void Do_EndOfLP

34、aren(char *strSource)uWord.syn=_SYN_LPAREN;uWord.value.T3=strSourcegnLocate;gnLocate+;gnRow+;return;void Do_EndOfRParen(char *strSource)uWord.syn=_SYN_RPAREN;gnLocate+;gnRow+;return;void Do_EndOfLeftBracket1(char *strSource)uWord.syn=_SYN_LEFTBRACKET1;uWord.value.T3=strSourcegnLocate;gnLocate+;gnRow

35、+;return;void Do_EndOfRightBracket1(char *strSource)uWord.syn=_SYN_RIGHTBRACKET1;uWord.value.T3=strSourcegnLocate;gnLocate+;gnRow+;return;void Do_EndOfLeftBracket2(char *strSource) uWord.syn=_SYN_LEFTBRACKET2;uWord.value.T3=strSourcegnLocate;gnLocate+;gnRow+;return;void Do_EndOfRightBracket2(char *s

36、trSource)uWord.syn=_SYN_RIGHTBRACKET2;uWord.value.T3=strSourcegnLocate;gnLocate+;gnRow+;return;void Do_EndOfColon(char *strSource)uWord.syn=_SYN_COLON;uWord.value.T3=strSourcegnLocate;gnLocate+;gnRow+;return;void Do_EndOfComma(char *strSource)uWord.syn=_SYN_COMMA;uWord.value.T3=strSourcegnLocate;gnL

37、ocate+;gnRow+;return;void Do_EndOfSemicolon(char *strSource)uWord.syn=_SYN_SEMICOLON;uWord.value.T3=strSourcegnLocate;gnLocate+;gnRow+;return;void Do_EndOfMore(char *strSource)if(strSourcegnLocate+1!='=')uWord.syn=_SYN_LG;uWord.value.T3=strSourcegnLocate;elsegnLocate+;gnRow+;uWord.syn=_SYN_M

38、E;strcpy(uWord.value.T1,">=");gnLocate+;gnRow+;return;void Do_EndOfLess(char *strSource)if(strSourcegnLocate+1!='=')uWord.syn=_SYN_LT;uWord.value.T3=strSourcegnLocate;elsegnLocate+;gnRow+;uWord.syn=_SYN_LE;strcpy(uWord.value.T1,"<=");gnLocate+;gnRow+;return;void Do_

39、EndOfEnd(char *strSource)uWord.syn=_SYN_END;uWord.value.T3=strSourcegnLocate;gnLocate+;gnRow+;return;void PrintWord(WORD uWord)/ 輸出單詞二元組(種別碼,單詞)if(uWord.syn<=_SYN_ID|uWord.syn=_SYN_ME|uWord.syn=_SYN_LE|uWord.syn=_SYN_EQ)fprintf(fw,"n(%d,t%s)",uWord.syn,uWord. value.T1);else if(uWord.syn

40、=_SYN_NUM)fprintf(fw,"n(%d,t%d)",uWord.syn,uWord. value.T2);elsefprintf(fw,"n(%d,t%c)",uWord.syn,uWord. value.T3);return;void ApartWord(char *strSource)/ 識別出當前合法文件中所有單詞,所以是一個調用 scaner() 函數的循環(huán)。gnColumn=gnRow=1;gnLocate=gnLocateStart=0;while(strSourcegnLocate)Scaner();return;void P

41、rintError(int nColumn,int nRow,charchInput)fprintf(fw,"n 無 法 識 別 的 單 詞->Col:%dtRow:%dtChar:%c",nColumn,nRow,chInput);void Scaner(void)/ 詞法分析框架函數Do_Start(strSource);PrintWord(uWord);return;/ 以下注釋中為詞法分析部分的測試主函數/*void main()strSource="main()inti=10;while(i)i=i-1;"fw=stdout;ApartW

42、ord(strSource);*/只要做詞法分析,則下面代碼不要void LocateError(int nColumn,int nRow)/ 輸出錯誤所在的行、列提示信息fprintf(fw,"nCol:%dtRow:%d->",nColumn +1,nRow);void error(char *strError)/ 輸出具體錯誤信息(傳給fw 指向的文件,即輸出文件) ,/ 本程序錯誤信息種類設置較簡單, 可以自己補充。LocateError(gnColumn,gnRow);fprintf(fw,"%s",strError);return;vo

43、id Match(int syn,char *strError)/ 判斷當前識別出的單詞是否與語法中約定的相符,/ 若相符,調用 scaner() 識別下一個單詞備用;否則報語法分析錯if(syn=uWord.syn) Scaner();else error(strError);return;void gen(char *op,char *argv1,char *argv2,char*result)/ 隨著進程生成四元組,將其保存在 pQuad 結構體數組中,為輸出作準備sprintf(pQuadnNXQ.op,op);sprintf(pQuadnNXQ.argv1,argv1);sprint

44、f(pQuadnNXQ.argv2,argv2);sprintf(pQuadnNXQ.result,result);nNXQ+;return;void PrintQuaternion(void)/ 輸出四元組int nLoop;for(nLoop=1;nLoop<nNXQ;nLoop+)fprintf(fw,"n%d:%s,t%s,t%s,t%s",nLoop,pQuadnLoop.op,pQuadnLoop.argv1,pQuadnLoop.argv2,pQuadnLoop.result);char *Newtemp(void)/自動產生中間結果標識“ T1”,“T

45、2”等字符串,以備輸出四元組用char *strTempID=(char *)malloc(MAXLENGTH);sprintf(strTempID,"T%d",+nSuffix);return strTempID;int merg(int p1,int p2)/ 合并 p1 和 p2int p,nResult;if(p2=0) nResult=p1;elsenResult=p=p2;while(atoi(pQuadp.result)p=atoi(pQuadp.result);sprintf(pQuadp.result,"%s",p1);return n

46、Result;void bp(int p,int t)/ 將中間結果(如: t1,t2 等)填到四元組中int w,q=p;while(q)w=atoi(pQuadq.result);sprintf(pQuadq.result,"%d",t);q=w;return;char *Expression(void)/ 處理表達式char oppMAXLENGTH,*eplace,eplace1MAXLENGTH,eplace2MAXLENGTH;eplace=(char *)malloc(MAXLENGTH);strcpy(eplace1,Term();strcpy(eplace

47、,eplace1);while(uWord.syn=_SYN_PLUS|uWord.syn=_SYN_MINUS)sprintf(opp,"%c",uWord.value.T3);Scaner();strcpy(eplace2,Term();strcpy(eplace,Newtemp();gen(opp,eplace1,eplace2,eplace);strcpy(eplace1,eplace);return eplace;char *Term(void)/ 處理相乘或相除 (可以連乘連除, 所以下面的分析是一個循環(huán))的項char opp2,*eplace,*eplace1

48、,*eplace2;eplace=(char *)malloc(MAXLENGTH);eplace=eplace1=Factor();strcpy(eplace,eplace1);while(uWord.syn=_SYN_TIMES|uWord.syn=_SYN_DIVIDE)sprintf(opp,"%c",uWord.value.T3);Scaner();eplace2=Factor();eplace=Newtemp();gen(opp,eplace1,eplace2,eplace); eplace1=eplace;return eplace;char *Factor(

49、void)/ 處理表達式中的因子,如 a1*12 中的 a1 和 12, 即 可以為數或標識符.char *eplace=(char *)malloc(MAXLENGTH);if(uWord.syn=_SYN_ID|uWord.syn=_SYN_NUM)if(uWord.syn=_SYN_ID)sprintf(eplace,"%s",uWord.value.T1);elsesprintf(eplace,"%d",uWord.value.T2);Scaner();elseMatch(_SYN_LPAREN,"(");eplace=Exp

50、ression();Match(_SYN_RPAREN,")");return eplace;void Condition(int *etc,int *efc)/ 處理條件表達式char opp3,*eplace1,*eplace2;char strTemp4;eplace1=Expression();if(uWord.syn<=_SYN_NE|uWord.syn>=_SYN_LG)switch(uWord.syn)case _SYN_LT:case _SYN_LG:sprintf(opp,"%c",uWord.value.T3);break

51、;default:sprintf(opp,"%s",uWord.value.T1);break;Scaner();eplace2=Expression();*etc=nNXQ;*efc=nNXQ+1;sprintf(strTemp,"j%s",opp);gen(strTemp,eplace1,eplace2,"0");gen("j","","","0");/ 條件表達式對應的四元組第一項加標志jelse error(" 關系運算符");

52、void Statement(int *nChain)/ 分析賦值、 if 、 while 語句charstrTempMAXLENGTH,eplaceMAXLENGTH;int nChainTemp,nWQUAD;switch(uWord.syn)/ 處理賦值語句case _SYN_ID:strcpy(strTemp,uWord.value.T1);Scaner();Match(_SYN_ASSIGN,"=");strcpy(eplace,Expression();Match(_SYN_SEMICOLON,"");gen("=",ep

53、lace,"",strTemp);*nChain=0;break;/ 處理 if 語句case _SYN_IF:Match(_SYN_IF,"if");Match(_SYN_LPAREN,"(");Condition(&ntc,&nfc);bp(ntc,nNXQ);Match(_SYN_RPAREN,")");Statement_Block(&nChainTemp);*nChain=merg(nChainTemp,nfc); break;/ 處理 while 語句case _SYN_WHILE:Match(_SYN_WHILE,"while");nWQUAD=nNXQ;Match(_SYN_LPAREN,"(");Condition(&ntc,&nfc);

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論