編譯程序試驗(yàn)指導(dǎo)書講解_第1頁(yè)
編譯程序試驗(yàn)指導(dǎo)書講解_第2頁(yè)
編譯程序試驗(yàn)指導(dǎo)書講解_第3頁(yè)
編譯程序試驗(yàn)指導(dǎo)書講解_第4頁(yè)
編譯程序試驗(yàn)指導(dǎo)書講解_第5頁(yè)
已閱讀5頁(yè),還剩29頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、編譯程序?qū)嶒?yàn)指導(dǎo)書實(shí)驗(yàn)?zāi)康模河肅 語(yǔ)言對(duì)一個(gè)C 語(yǔ)言的子集編制一個(gè)一遍掃描的編譯程序,以加深對(duì)編譯原理的理解,掌握編譯程序的實(shí)現(xiàn)方法和技術(shù)。1 詞法分析1.1 實(shí)驗(yàn)?zāi)康?設(shè)計(jì)、編制并測(cè)試一個(gè)詞法分析程序,加深對(duì)詞法分析原理的理解。1.2 實(shí)驗(yàn)要求1.2.1 待分析的C語(yǔ)言子集的詞法1. 關(guān)鍵字main if else int char for while所有的關(guān)鍵字都是小寫。2專用符號(hào)= + - * / < <= > >= = != ; : , ( )3其他標(biāo)記ID 和 NUM通過(guò)以下正規(guī)式定義其他標(biāo)記:_ _ _ _ _ _ _ *ID fletter(letter|

2、digit)*NUM» digit digitletter fa| |z|A| |Zdigit -0| |9 4空格由空白、制表符和換行符組成空格一般用來(lái)分隔ID、NUM專用符號(hào)和關(guān)鍵字,詞法分析階段通常被忽略。1.2.2 各種單詞符號(hào)對(duì)應(yīng)的種別碼表 1 各種單詞符號(hào)的種別碼單詞符號(hào)種別碼單詞符號(hào)種別碼單詞符號(hào)種別碼main 1=21,32int 2+22:33char 3-23;34if4*24>35else 5/25<36for 6(26>=37while 7)27<=38ID1028=39MUN 2029!=4030 0 100031ERROR -11.

3、2.3 詞法分析程序的功能輸入:所給文法的源程序字符串。輸出:二元組(syn,token 或sum)構(gòu)成的序列。其中,.syn為單詞種別碼。.Token為存放的單詞自身字符串。.Sum為整型常量。具體實(shí)現(xiàn)時(shí),可以將單詞的二元組用結(jié)構(gòu)進(jìn)行處理。例如,對(duì)源程序main()int i=10;while(i) i=i-1;的源文件,經(jīng)詞法分析后輸出如下序列:(1,main) (26,() (27,) (30, (2,int) (10,i) (21,=) (20,10) (34,;) (7,while) (26,() (10,i) (27,) (10,i) (21,=) (10,i) (23,-) (2

4、0,1) (34,;) (31,)1.3 詞法分析程序的主要算法思想其基本思想是算法的基本任務(wù)是從字符串表示的源程序中識(shí)別出具有獨(dú)立意義的單詞符號(hào), 根據(jù)掃描到的單詞符號(hào)的第一個(gè)字符的種類,拼出相應(yīng)的單詞符號(hào)。1 .主程序示意圖主程序示意圖如圖1所示。其中初值包括如下兩方面:(1)關(guān)鍵字表初值關(guān)鍵字作為特殊標(biāo)識(shí)符處理圖1詞法分析主程序示意圖,把它們預(yù)先安排在一張表格中(稱為關(guān)鍵字表,當(dāng)掃描程序識(shí)別出標(biāo)識(shí)符時(shí),查關(guān)鍵字表。如能查到匹配的單詞,則該單詞為關(guān)鍵字,否則為一般標(biāo)識(shí)符。關(guān)鍵字表為一個(gè)字符串?dāng)?shù)組,其描述如下:char *KEY_WORDS8= main"," int &

5、quot;, " char ", " if ", " else "," for "," while "為分析方便,這里把 main作關(guān)鍵字處理。(2)程序中需要用到的主要變量:syn,token和surnu2 .掃描子程序的算法思想首先設(shè)置三個(gè)變量:token用來(lái)存放構(gòu)成單詞符號(hào)的字符串;sum用來(lái)存放整型單詞;syn2 .語(yǔ)法分析2.1 實(shí)驗(yàn)?zāi)康木幹埔粋€(gè)遞歸下降分析程序,實(shí)現(xiàn)對(duì)詞法分析程序所提供的單詞序列進(jìn)行語(yǔ)法檢查和結(jié)構(gòu)分析。2.2 實(shí)驗(yàn)要求利用C語(yǔ)言編制遞歸下降分析程序,并對(duì)C語(yǔ)言的簡(jiǎn)單子

6、集進(jìn)行分析。2.2.1 待分析的C語(yǔ)言子集的語(yǔ)法用擴(kuò)充的BNF表示如下:(1) 程序 :=main() 語(yǔ)句塊(2) 語(yǔ)句塊:='' 語(yǔ)句串''(3) 語(yǔ)句串 :=語(yǔ)句;語(yǔ)句;(4) 語(yǔ)句 :=賦值語(yǔ)句|條件語(yǔ)句|循環(huán)語(yǔ)句(5) 賦值語(yǔ)句:=ID=表達(dá)式(6) 條件語(yǔ)句:=if(條件 ) 語(yǔ)句塊(7) 循環(huán)語(yǔ)句:=while條件 語(yǔ)句塊(8) 條件 :=表達(dá)式 關(guān)系運(yùn)算符 表達(dá)式(9) 表達(dá)式 :=項(xiàng)+項(xiàng)卜 項(xiàng)(10)項(xiàng):=因子*因子|/因子(11) 因子 :=ID|NUM|( 表達(dá)式 )(12) 關(guān)系運(yùn)算符 :=|=|=|=|!=2.3 語(yǔ)法分析程序的算法思想

7、(1) 主程序示意圖如圖3所示。圖3語(yǔ)法分析主程序示意圖(2) 遞歸下降分析程序示意圖如圖4所示。(3) 語(yǔ)句塊分析過(guò)程示意圖如圖5所示。出口圖5語(yǔ)句塊分析示意圖(4) 語(yǔ)句串分析過(guò)程示意圖如圖6所示。圖6語(yǔ)句串分析示意圖(5) statement ( 語(yǔ)句)函數(shù)流程如圖7所示;(6) expression (表達(dá)式)分析過(guò)程如圖8所示;(7) term (項(xiàng))分析過(guò)程如圖 9所示;(8) condition (條件)分析過(guò)程如圖 10所示;(9) factor (因子)分析過(guò)程如圖11所示。圖10 condition分析過(guò)程示意圖圖7 statement 函數(shù)流程圖8 expression分

8、析過(guò)程示意圖圖9 term分析過(guò)程示意圖調(diào)用 expression調(diào)用scaner出錯(cuò)處理調(diào)用 expression出錯(cuò)處理調(diào)用scaner圖11 factor分析過(guò)程示意圖3.語(yǔ)義分析產(chǎn)生中間代碼3.1實(shí)驗(yàn)?zāi)康耐ㄟ^(guò)上機(jī)實(shí)驗(yàn),加深對(duì)語(yǔ)法制導(dǎo)翻譯原理的理解,掌握將語(yǔ)法分析所識(shí)別的語(yǔ)法成分變換 為中間代碼的語(yǔ)義翻譯方法。3.2實(shí)驗(yàn)要求采用遞歸下降語(yǔ)法制導(dǎo)翻譯法對(duì)算術(shù)表達(dá)式、賦值語(yǔ)句、條件語(yǔ)句、循環(huán)語(yǔ)句進(jìn)行語(yǔ)義分 析生成四元式序列。3.2.1 實(shí)驗(yàn)的輸入和輸出輸入是語(yǔ)法分析提供的正確的單詞串,輸出是四元式序列。例如,對(duì)于語(yǔ)句串i=2*3+4;if (i>10) j=3;while j>1

9、0 k=1;輸出的四元式序列如下:(2) (5)(6)(8)(9)(*,2,3,T1) (+,2,T1,T2) (二,T2, ,i) (j>,i,10,6) (j<,,7) (二,3, ,j)(j<,j,10,9) (j, ,11) (=,1,k)(10)(j, , ,7)(11)3.2.2 算法思想1 .設(shè)置語(yǔ)義過(guò)程(1) . int gen(op,arg1,arg2,result)該函數(shù)是將四元式 (op,arg1,arg2,result)送到四元式表中。(2) . char *newtemp()該函數(shù)回送一個(gè)新的臨時(shí)變量名,臨時(shí)變量名產(chǎn)生的順序?yàn)?3) . int me

10、rg(p1,p2)T1,T2,.該函數(shù)將以pl和p2為頭指針的兩條鏈合并為一,合并后的鏈?zhǔn)诪榉祷刂怠?4). int bp(p,t)該函數(shù)的功能是把2.主程序示意圖p所鏈接的每個(gè)四元式的第四區(qū)段都填為調(diào)用parser圖12語(yǔ)義分析主程序示意圖3 .函數(shù)Irparser 在原來(lái)語(yǔ)法分析的基礎(chǔ)上插入相應(yīng)的語(yǔ)義動(dòng)作將輸入串翻譯成四元式序列。在實(shí)驗(yàn)中我們只對(duì)表達(dá)式、if語(yǔ)句和while語(yǔ)句進(jìn)行翻譯,其具體翻譯程序見實(shí)驗(yàn)實(shí)例。4 .實(shí)驗(yàn)實(shí)例/*/* 文件:globals.h*/*定義分析器需要的一些數(shù)據(jù)結(jié)構(gòu)、宏等 */*本頭文件必須在其他文件前引用*/*/# ifndef _GLOBALS_H# def

11、ine _GLOBALS_H# include <stdio.h># include <stdlib.h># include <string.h>/*單詞種別碼*/# define_SYN_MAIN1# define_SYN_INT2# define_SYN_CHAR3# define_SYN_IF4# define_SYN_ELSE5# define_SYN_FOR6# define_SYN_WHILE7/*以上為關(guān)鍵字的單詞種別碼*/# define_SYN_ID10/*標(biāo)識(shí)符的單詞種別碼 */# define_SYN_NUM20/*整數(shù)的單詞種別碼 *

12、/# define_SYN_ASSIGN21/* = */# define_SYN_PLUS22/* + */# define_SYN_MINUS23/* -*/# define_SYN_TIMES24/* */# define_SYN_DIVIDE25/* /*/# define_SYN_LPAREN26 /*( */# define_SYN_RPAREN27 /*) */# define_SYN_LEFTBRACKET128 /* */# define_SYN_RIGHTBRACKET129 /* */# define_SYN_LEFTBRACKET230 /* */# define_SY

13、N_RIGHTBRACKET231 /* */# define_SYN_COMMA32/* ,*/# define_SYN_COLON33/* :*/# define_SYN_SEMICOLON34 /*; */# define_SYN_LG35 /*> */# define_SYN_LT36 /*< */# define_SYN_ME37 /*>= */# define_SYN_LE38 /*<= */# define_SYN_EQ39 /*= */# define_SYN_NE40 /*!= */# define_SYN_END1000/* 源程序結(jié)束標(biāo)志*/# d

14、efine_SYN_ERROR-1/* error*/# defineMAXLENGTH255/* 一行允許的字符個(gè)數(shù)unionWORDCONTENT/*存放單詞內(nèi)容的聯(lián)合*/char T1MAXLENGTH;int T2;char T3;typedef struct WORD /*單詞二元組*/int syn;union WORDCONTENT value; WORD;# endif/*/*/*/*文件:scan.h/*定義詞法分析器的接口/*/# ifndef _SCAN_H# define _SCAN_H/* 一個(gè) TAB 占用的空格數(shù)*/# define _TAB_LENGTH4/*

15、關(guān)鍵字結(jié)束標(biāo)記*/# define _KEY_WORD_END"waiting for your expanding/* 函數(shù) Scaner 得到源程序里的下一個(gè)單詞符號(hào)*/void Scaner(void);# endif/*/*文件:scan.c/*分析器的詞法掃描部分*/*/# include "globals.h"# Include "scan.h"void Do_Tag(char *strSource);void Do_Digit(char *strSource);void Do_EndOfTag(char *strSource);v

16、oid Do_EndOfDigit(char *strSource);void Do_EndOfEqual(char *strSource);void Do_EndOfPlus(char *strSource);void Do_EndOfSubtraction(char *strSource);void Do_EndOfMultiply(char *strSource);void Do_EndOfDivide(char *strSource);void Do_EndOfLParen(char *strSource);void Do_EndOfRParen(char *strSource);vo

17、id Do_EndOfLeftBracket1(char *strSource);void Do_EndOfRightBracket1(char *strSource);void Do_EndOfLeftBracket2(char *strSource);void Do_EndOfRightBracket2(char *strSource);void Do_EndOfColon(char *strSource);void Do_EndOfComma(char *strSource);void Do_EndOfSemicolon(char *strSource);void Do_EndOfMor

18、e(char *strSource);void Do_EndOfLess(char *strSource);void Do_EndOfEnd(char *strSource);/* 識(shí)別標(biāo)識(shí)符的中間狀態(tài)*/* 識(shí)別數(shù)字的中間狀態(tài)*/* 識(shí)別標(biāo)識(shí)符最后的一個(gè)狀態(tài)*/* 識(shí)別數(shù)字最后的一個(gè)狀態(tài)*/* =,=*/* + */*-*/*/*/*/*(*/*)*/*/*/*/*/*:*/*,*/*;*/* >,>=*/*<,<=*/*用 ' 0 ' 作為源程序結(jié)束*/*/* 詞法分析錯(cuò)誤輸出*/void Scaner(void) ;/* 詞法掃描函數(shù)*/exter

19、n char*strSource;extern FILE*fw ;int gnColumn,gnRow, gnLocate, gnLocateStart;/* 待分析的源程序*/* 結(jié)果輸出文件*/* 行列號(hào)*/* 下一個(gè)字符腳標(biāo)*/* 下一個(gè)單詞開始位置*/void PrintError(int nColumn,int nRow,char chInput);Word uWord;/* 掃描出的單詞*/* 關(guān)鍵字表*/char*KEY_WORDS20="main","int","char","if","e

20、lse","for","while","void",_KEY_WORD_END;int IsDigit(char chInput) /* 判斷掃描的字符是否數(shù)字*/if (chInput<='9' && chInput>='0') return 1;else return 0;int IsChar(char chInput) /* 判斷掃描的字符是否字母*/if (chInput<='z' && chInput>='

21、;a')| (chInput<='Z' && chInput>='A')return 1;else return 0;void Do_Start(char *strSource) /* 開始識(shí)別最先一個(gè)單詞*/gnLocateStart=gnLocate;switch (strSourcegnLocate) /* 根據(jù)第一個(gè)字符判斷*/case'+': Do_EndOfPlus(strSource);break;casecase'-': Do_EndOfSubtraction(strSource

22、); break;'*': Do_EndOfMultiply(strSource);break;case'/': Do_EndOfDivide(strSource);break;case'(': Do_EndOfLParen(strSource);break;case')': Do_EndOfRParen(strSource);break;case'': Do_EndOfLeftBracket1(strSource);break;case'': Do_EndOfRightBracket1(strSo

23、urce);break;case'': Do_EndOfLeftBracket2(strSource);break;case'': Do_EndOfRightBracket2(strSource);break;case':': Do_EndOfColon(strSource);break;case',': Do_EndOfComma(strSource);break;case'': Do_EndOfSemicolon(strSource);break;case'>': Do_EndOfMore

24、(strSource);break;case'<': Do_EndOfLess(strSource);break;case'=': Do_EndOfEqual(strSource);break;case'0': Do_EndOfEnd(strSource);break;default:if (IsChar(strSourcegnLocate) /* 是標(biāo)識(shí)符或關(guān)鍵字*/Do_Tag(strSource);else if (IsDigit(strSourcegnLocate) /* 可能是整數(shù)*/uWord.value.T2=strSourc

25、egnLocate-'0'Do_Digit(strSource);else /* 其他符號(hào)*/if (strSourcegnLocate!=' '&& strSourcegnLocate!='t'&& strSourcegnLocate!=' n'&& strSourcegnLocate!='r'PrintError(gnColumn,gnRow,strSourcegnLocate);if (strSourcegnLocate='n '| strSou

26、rcegnLocate='r') gnColumn+;gnRow=1;else if (strSourcegnLocate='t') gnColumn+=_TAB_LENGTH;else gnRow+;gnLocate+;Do_Start(strSouce);break; return;void Do_Tag(char *strSource)/* 識(shí)別標(biāo)識(shí)符的中間狀態(tài)*/gnLocate+;gnRow+;if (IsChar(strSourcegnLocate) | IsDigit(strSourcegnLocate)/* 是數(shù)字或者字母*/Do_Tag(str

27、Source);else Do_EndOfTag(strSource);return;void Do_Digit(char *strSource)/* 識(shí)別整數(shù)的中間狀態(tài)*/gnLocate+;gnRow+;if (IsDigit(strSourcegnLocate)/* 累加識(shí)別的數(shù)字*/uWord.value.T2=uWord.value.T2*10 +strSourcegnLocate-'0'Do_Digit(strSource);else Do_EndOfDigit(strSource); return;void Do_EndOfTag(char *strSource)

28、/* 標(biāo)識(shí)符的最后狀態(tài)*/int nLoop;uWord.syn=_SYN_ID;/* 單詞種別碼缺省為標(biāo)識(shí)符*/* 記錄標(biāo)識(shí)符*/strncpy(uWord.value.T1,strSource+gnLocateStart,gnLocate-gnLocateStart); uWord.value.T1gnLocate-gnLocateStart='0'nLoop=0;while (strcmp(KEY_WORDSnLoop,_KEY_WORD_END) /*/*查關(guān)鍵字表,是否關(guān)鍵字*/if (! strcmp(KEY_WORDSnLoop,uWord.value.T1)比較

29、和某關(guān)鍵字相符*/uWord.syn=nLoop+1;break;nLoop+;return;/* 設(shè)置正確的syn */void Do_EndOfDigit(char *strSource) /* 識(shí)別數(shù)字的最后狀態(tài)*/uWord.syn=_SYN_NUM;return;void Do_EndOfEqual(char *strSource)/* =,= */if (strSourcegnLocate+1!='=')uWord.syn=_SYN_ASSIGN;/* = */uWord.value.T3=strSourcegnLocate;else gnLocate+;/* =

30、*/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;uWord.value.T3=strSourceg

31、nLocate;gnLocate+;gnRow+;return;void Do_EndOfMultply(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_EndOfLParen(cha

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

33、ord.value.T3=strSourcegnLocate;gnLocate+;gnRow+;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;gn

34、Locate+;gnRow+;return;void Do_EndOfRightBracket2(char *strSource) /* */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

35、 *strSource)/* , */uWord.syn=_SYN_COMMA;uWord.value.T3=strSourcegnLocate;gnLocate+;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!=

36、'=') /* > */uWord.syn=_SYN_LG;uWord.value.T3=strSourcegnLocate;else /*>= */gnLocate+;gnRow+;uWord.syn=_SYN_ME;strcpy(uWord.value.T1,">=");gnLocate+;gnRow+;return;void Do_EndOfLess(char *strSource)/* <,<= */if (strSourcegnLocate+1!='=') /* < */uWord.syn=_SY

37、N_LT;uWord.value.T3=strSourcegnLocate;else /*<= */gnLocate+;gnRow+;uWord.syn=_SYN_LE;strcpy(uWord.value.T1,"<=");gnLocate+;gnRow+;return;uWord.syn=_SYN_END;uWord.value.T3=strSourcegnLocate;gnLocate+;gnRow+; return;void PrintWord(Word uWord)if (uWord.syn<=_SYN_ID| uWord.syn=_SYN_ME

38、 /* >= */| uWord.syn=_SYN_LE| uWord.syn=_SYN_EQ) /* 打印二元組*/* 關(guān)鍵字、標(biāo)識(shí)符或者有錯(cuò)誤*/* <= */* = */fprintf(fw,"n(%d,t%s)",uWord.syn,uWord.value.T1);else if (uWord.syn=_SYN_NUM) /* 數(shù)字 */fprintf(fw,"n(%d,t%d)",uWord.syn,uWord.value.T2);else /* 其他符號(hào)*/fprintf(fw,"n(%d,t%c)",uWor

39、d.syn,uWord.value.T3);return;*/void ApartWord(char *strSource)/* 根據(jù)輸入的源程序識(shí)別所有的單詞gnColumn=gnRow=1;gnLocate=gnLocateStart=0;while (strSourcegnLocate) Scaner( ); return;void Scaner(void)/* 詞法掃描函數(shù)*/Do_Start(strSource);/* 識(shí)別出一個(gè)單詞*/printWord(uWord);/* 打印二元組*/return;void PrintError(int nColumn,int nRow,cha

40、r chInput)/* 打印詞法掃描發(fā)現(xiàn)的錯(cuò)誤*/fprintf(fw,"n 無(wú)法識(shí)別的單詞->Col:%dtRow:%dtChar:%c",nColumn,nRow,chInput);return; /*/*文件: semanteme.h/*定義語(yǔ)法(語(yǔ)義)分析器的接口*/*/*/# ifndef _SEMANTEME_H# define _SEMANTEME_H/* 四元組的結(jié)構(gòu)*/typedef struct QUAD char opMAXLENGTH; /*char argv1MAXLENGTH;char argv2MAXLENGTH;char result

41、MAXLENGTH;QUATERNION;操作符 */* 第一個(gè)操作數(shù)*/* 第二個(gè)操作數(shù)*/* 運(yùn)算結(jié)果*/void lrparse(void); /* 語(yǔ)法語(yǔ)義分析主函數(shù)*/# endif/*/*文件: semanteme.c*/*分析器的語(yǔ)法語(yǔ)義掃描部分*/*/# include "globals.h"# include "scan.h"# include "semanteme.h"QUATERNION *pQuad;/* 存放四元組的元組*/int nSuffix,nNXQ,/* 臨時(shí)變量的編號(hào)*/ntc,nfc;extern

42、 Word uWord;/* 掃描得到的單詞*/extern int gnColumn,gnRow; /* 行列號(hào) */FILE *fw;/* 打印結(jié)果的文件指針*/char *strFileName; /* 打印結(jié)果的文件名*/char *strSource;/* 源程序 */char *Expression(void);char *Term(void);char *Factor(void);void Statement_Block(int *nChain);void LocateError(int nColumn,int nRow) /* 定位語(yǔ)法錯(cuò)誤*/fprintf(fw,"

43、nCol:%dtRow:%d->",nColumn+1,nRow);void error(char *strError)/* 輸出掃描發(fā)現(xiàn)的錯(cuò)誤*/LocateError(gnColumn,gnRow);fprintf(fw,"%s",strError); return;void Match(int syn,char *strError)/* 判斷當(dāng)前識(shí)別出的單詞是否需要的單詞,如果不是則報(bào)錯(cuò),否則掃描下一個(gè)單詞*/if (syn=uWod.syn) Scaner( );else error(strError); return;*/void gen(char

44、 *op,char *argv1,char *argv2,char *result)/* 生成一個(gè)四元式sprintf(pQuadnNXQ.op,op);sprintf(pQuadnNXQ.argv1,argv1);sprintf(pQuadnNXQ.argv2,argv2);sprintf(pQuadnNXQ.result,result);nNXQ+; return;void PrintQuaternion(void) /* 打印一個(gè)四元式*/int nLoop;for (nLoop=1;nLoop<nNXQ;nLoop+) fprintf(fw,"n%d:%s,t%s,t%

45、s", nLoop,pQuadnLoop.op,pQuadnLoop.argv1, pQuadnLoop.argv2,pQuadnLoop.result);char *Newtemp(void)/* 產(chǎn)生一個(gè)臨時(shí)變量*/char *strTempID=(char *) malloc(MAXLENGTH); sprintf(strTempID,"T%d",+nSuffix); return strTempID;int merg(int p1,int p2)/* 合并 p1 和 p2 */int p,nResult;if (p2=0) nResult=p1; else

46、 nResult=p=p2;while (atoi(pQuadp.result) p=atoi(pQuadp.result);sprintf(pQuadp.result,"%d",p1); return nResult; void bp(int p,int t) /* 將 t 回填到以p 為首的四元式鏈中*/int w,q=p;while (q)w=atoi(pQuadq.result);sprintf(pQuadq.result,"%d",t);q=w; return;char *Expression(void)char oppMAXLENGTH,*e

47、place,eplace1MAXLENGTH,eplace2MAXLENGTH;eplace=(char *) malloc(MAXLENGTH);strcpy(eplace1,Term( );strcpy(eplace,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,epla

48、ce2,eplace);strcpy(eplace1,eplace);return;char *Term(void)char opp2,*eplace1,*eplace2,*eplace;eplace=eplace1=Factor( );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)

49、;eplace1=eplace;return eplace;char *Factor(void)char *eplace=(char *) malloc(MAXLENGTH);if (uWord.syn=_SYN_ID | uWord.syn=_SYN_NUM)/* i */if (uWord.syn=_SYN_ID) sprintf(eplace,"%s",uWord.value.T1);else sprintf(eplace,"%d",uWord.value.T2);Scaner( );else Match(_SYN_LPAREN,"(&q

50、uot;);eplace=Expression( );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)swich (uWord.syn) case _SYN_LT: case _SYN_LG:sprintf(opp,"%c",uWord.value.T3);break;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")else err

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論