編譯原理PL0課程設(shè)計(jì)報(bào)告(共32頁(yè))_第1頁(yè)
編譯原理PL0課程設(shè)計(jì)報(bào)告(共32頁(yè))_第2頁(yè)
編譯原理PL0課程設(shè)計(jì)報(bào)告(共32頁(yè))_第3頁(yè)
編譯原理PL0課程設(shè)計(jì)報(bào)告(共32頁(yè))_第4頁(yè)
編譯原理PL0課程設(shè)計(jì)報(bào)告(共32頁(yè))_第5頁(yè)
已閱讀5頁(yè),還剩28頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、精選優(yōu)質(zhì)文檔-傾情為你奉上課 程 設(shè) 計(jì) 班級(jí):21301學(xué)號(hào):姓名:馬瑞澤百度一.課程設(shè)計(jì)目的在分析理解一個(gè)教學(xué)型編譯程序(如PL/0)的基礎(chǔ)上,對(duì)其詞法分析程序、語(yǔ)法分析程序和語(yǔ)義處理程序進(jìn)行部分修改擴(kuò)充。達(dá)到進(jìn)一步了解程序編譯過(guò)程的基本原理和基本實(shí)現(xiàn)方法的目的。二課程設(shè)計(jì)要求1. 基本內(nèi)容(1)擴(kuò)充賦值運(yùn)算:+= 和 -=(2)擴(kuò)充語(yǔ)句(Pascal的FOR語(yǔ)句):FOR <變量>:=<表達(dá)式> TO <表達(dá)式> DO <語(yǔ)句>FOR <變量>:=<表達(dá)式> DOWNTO <表達(dá)式> DO <語(yǔ)句&

2、gt; 其中,語(yǔ)句的循環(huán)變量的步長(zhǎng)為2,語(yǔ)句的循環(huán)變量的步長(zhǎng)為-2。2. 選做內(nèi)容(1)增加運(yùn)算:+ 和 -。(2)增加類(lèi)型: 字符類(lèi)型; 實(shí)數(shù)類(lèi)型。(3)擴(kuò)充函數(shù): 有返回值和返回語(yǔ)句; 有參數(shù)函數(shù)。(4)增加一維數(shù)組類(lèi)型(可增加指令)。(5)其他典型語(yǔ)言設(shè)施。3.本人在課程設(shè)計(jì)中已實(shí)現(xiàn)的功能(1)增加單詞:保留字 ELSE,F(xiàn)OR,TO,DOWNTO, REPEAT, UNTIL, RETURN運(yùn)算符 +=,-=,+,-(2)修改單詞:不等號(hào)# 改為 <>(3)增加條件語(yǔ)句的ELSE子句(4)擴(kuò)充賦值運(yùn)算:+= 和 -=(5)擴(kuò)充語(yǔ)句 FOR <變量>:=<表

3、達(dá)式> TO <表達(dá)式> DO <語(yǔ)句>FOR <變量>:=<表達(dá)式> DOWNTO <表達(dá)式> DO <語(yǔ)句>(6)增加運(yùn)算:+ 和 -(包括前后+、-運(yùn)算)(7)增加一維數(shù)組類(lèi)型(8) 其他典型語(yǔ)言設(shè)施:REPEAT 語(yǔ)句 UNTIL 語(yǔ)句三課程設(shè)計(jì)環(huán)境與工具(1)計(jì)算機(jī)及操作系統(tǒng):PC機(jī),Win7(2)實(shí)現(xiàn)工具:VC+ 6.0, C語(yǔ)言(3) 教學(xué)型編譯程序:PL/0 四結(jié)構(gòu)設(shè)計(jì)說(shuō)明1) PL/0編譯程序的結(jié)構(gòu)圖2) PL/0編譯程序的過(guò)程或函數(shù)的功能表過(guò)程或函數(shù)名簡(jiǎn)要功能說(shuō)明pl0主程序error出錯(cuò)處理,打

4、印出錯(cuò)位置和錯(cuò)誤編碼getsym詞法分析,讀取一個(gè)單詞getch漏掉空格,讀取一個(gè)字符gen生成目標(biāo)代碼,并送入目標(biāo)程序區(qū)test測(cè)試當(dāng)前單詞符號(hào)是否合法block分程序分析處理過(guò)程enter登錄名字表position(函數(shù))查找標(biāo)識(shí)符在名字表中的位置constdeclaration常量定義處理vardeclaration變量說(shuō)明處理listode列出目標(biāo)代碼清單statement語(yǔ)句處理expression表達(dá)式處理term項(xiàng)處理factor因子處理condition條件處理interpret對(duì)目標(biāo)代碼的解釋執(zhí)行程序base(函數(shù))通過(guò)靜態(tài)鏈求出數(shù)據(jù)區(qū)的基地址3) PL/0編譯程序的總體流程

5、圖調(diào)用解釋過(guò)程interpret解釋執(zhí)行目標(biāo)執(zhí)行目標(biāo)程序 啟動(dòng)置初值調(diào)用getsym取單詞調(diào)用block過(guò)程是否為源程序結(jié)束符源程序是否有錯(cuò)誤結(jié)束出錯(cuò)打印錯(cuò)誤NNYY 4) 詞法分析詞法分析是編譯的第一個(gè)階段,它的主要任務(wù)是從左向右逐個(gè)字符地對(duì)源程序進(jìn)行掃描,產(chǎn)生一個(gè)個(gè)單詞序列用于語(yǔ)法分析。PL/0詞法分析程序GETSYM的功能是為語(yǔ)法分析提供單詞用的,是語(yǔ)法分析的基礎(chǔ),把輸入的字符串形式的源程序分割成一個(gè)個(gè)單詞符號(hào)。經(jīng)過(guò)詞法分析程序分析出來(lái)的單詞,對(duì)語(yǔ)言固有的單詞只給出類(lèi)別存放在全程變量SYM中,而對(duì)用戶(hù)定義的單詞(標(biāo)識(shí)符或常數(shù))既給出類(lèi)別又給值,其類(lèi)別放在SYM中,值放在全程變量ID或全程

6、變量NUM中,全部單詞種類(lèi)由編譯程序定義的純量類(lèi)型SYMBOL給出,稱(chēng)為語(yǔ)法詞匯表。詞法分析器的分析過(guò)程:調(diào)用GETSYM時(shí),它通過(guò)GETCH過(guò)程從源程序中獲得一個(gè)字符。如果這個(gè)字符是字母,則繼續(xù)獲取字符或數(shù)字,最終可以拼成一個(gè)單詞,查保留字表,如果查到為保留字,則把SYM變量賦成相應(yīng)的保留字類(lèi)型值;如果沒(méi)有查到,則這個(gè)單詞應(yīng)是一個(gè)用戶(hù)自定義的標(biāo)識(shí)符(可能是變量名、常量名或是過(guò)程的名字),把SYM置為IDENT,把這個(gè)單詞存入ID變量。查保留字表時(shí)使用了二分法查找以提高效率。如果Getch獲得的字符是數(shù)字,則繼續(xù)用Getch獲取數(shù)字,并把它們拼成一個(gè)整數(shù)或?qū)崝?shù),然后把SYM置為 INTEGER

7、,并把拼成的數(shù)值放入NUM變量。如果識(shí)別出其它合法的符號(hào)(比如:賦值號(hào)、大于號(hào)、小于等于號(hào)等),則把SYM則成相應(yīng)的類(lèi)型。如果遇到不合法的字符,把SYM置成NUL。詞法分析程序GETSYM將完成下列任務(wù):(1)濾空格 (2)識(shí)別保留字 (3)識(shí)別標(biāo)識(shí)符(4)拼數(shù) (5)拼復(fù)合詞 (6)輸出源程序程序分程序語(yǔ)句條件表達(dá)式項(xiàng)因子PL/0 語(yǔ)法調(diào)用關(guān)系圖5) 語(yǔ)法分析PL/0編譯程序的語(yǔ)法分析采用了自頂向下的遞歸的子程序法。語(yǔ)法分析同時(shí)也根據(jù)程序的語(yǔ)義生成相應(yīng)三元代碼,并提供了出錯(cuò)處理的機(jī)制。語(yǔ)法分析主要由分程序分析過(guò)程(BLOCK)、常量定義分析過(guò)程(ConstDeclaration)、變量定義分

8、析過(guò)程(Vardeclaration)、語(yǔ)句分析過(guò)程(Statement)、表達(dá)式處理過(guò)程(Expression)、項(xiàng)處理過(guò)程(Term)、因子處理過(guò)程(Factor)和條件處理過(guò)程(Condition)構(gòu)成。這些過(guò)程在結(jié)構(gòu)上構(gòu)成一個(gè)嵌套的層次結(jié)構(gòu)。除此之外,還有出錯(cuò)報(bào)告過(guò)程(Error)、代碼生成過(guò)程(Gen)、測(cè)試單詞合法性及出錯(cuò)恢復(fù)過(guò)程(Test)、登錄名字表過(guò)程(Enter)、查詢(xún)名字表函數(shù)(Position)以及列出類(lèi) PCODE代碼過(guò)程(Listcode)作過(guò)語(yǔ)法分析的輔助過(guò)程。由PL/0的語(yǔ)法圖可知:一個(gè)完整的PL/0程序是由分程序和句號(hào)構(gòu)成的。因此,本編譯程序在運(yùn)行的時(shí)候,通過(guò)

9、主程序中調(diào)用分程序處理過(guò)程block來(lái)分析分程序部分(分程序分析過(guò)程中還可能會(huì)遞歸調(diào)用block過(guò)程),然后,判斷最后讀入的符號(hào)是否為句號(hào)。如果是句號(hào)且分程序分析中未出錯(cuò),則是一個(gè)合法的PL/0程序,可以運(yùn)行生成的代碼,否則就說(shuō)明源PL/0程序是不合法的,輸出出錯(cuò)提示即可。6) 語(yǔ)義分析PL/0 的語(yǔ)義分析主要進(jìn)行以下檢查:(1) 是否存在標(biāo)識(shí)符先引用未聲明的情況;(2) 是否存在己聲明的標(biāo)識(shí)符的錯(cuò)誤引用;(3) 是否存在一般標(biāo)識(shí)符的多重聲明。7) 中間代碼生成目標(biāo)代碼類(lèi)pcode是一種假想棧式計(jì)算機(jī)的匯編語(yǔ)言。自己添加覆蓋了OPR 0 14棧頂值輸出至屏幕(字符型)OPR 0 15棧頂值輸出

10、至屏幕(整數(shù)型)OPR 0 16棧頂值輸出至屏幕(實(shí)數(shù)型)OPR 0 17屏幕輸出換行OPR 0 18從命令行讀入一個(gè)字符輸入置于棧頂OPR 0 19從命令行讀入一個(gè)整數(shù)輸入置于棧頂OPR 0 20從命令行讀入一個(gè)實(shí)數(shù)輸入置于棧頂8) 語(yǔ)法錯(cuò)誤處理PL/0編譯程序?qū)φZ(yǔ)法錯(cuò)誤的處理采用兩種辦法:(1)對(duì)于一些易于校正的錯(cuò)誤,如丟了逗號(hào)、分號(hào)等,指出出錯(cuò)的位置,加以校正,繼續(xù)進(jìn)行分析。 (2)對(duì)于難于校正的錯(cuò)誤,給出錯(cuò)誤的位置與性質(zhì),跳過(guò)后面一些單詞,直到下一個(gè)可以進(jìn)行正常語(yǔ)法分析的語(yǔ)法單位。錯(cuò)誤類(lèi)型如下0 過(guò)程開(kāi)始部分說(shuō)明不正確1 常數(shù)說(shuō)明中"="寫(xiě)成":=&quo

11、t;2 常數(shù)說(shuō)明中"="后應(yīng)為整數(shù)或?qū)崝?shù)或字符3 常數(shù)說(shuō)明中的標(biāo)識(shí)符后應(yīng)是"="4 const, var, procedure后應(yīng)為標(biāo)識(shí)符5 漏掉了","或""6 過(guò)程說(shuō)明后的符號(hào)不正確(應(yīng)該是語(yǔ)句開(kāi)始符,或過(guò)程定義符)7 應(yīng)是語(yǔ)句開(kāi)始符8 程序體內(nèi)語(yǔ)句部分的后跟符不正確9 程序結(jié)尾丟了句號(hào)"."10 語(yǔ)句間漏了""11 標(biāo)識(shí)符未說(shuō)明12 賦值語(yǔ)句中,賦值號(hào)左部標(biāo)識(shí)符屬性應(yīng)是變量13 變量后不能是此符號(hào)14 call后應(yīng)為標(biāo)識(shí)符15 call后標(biāo)識(shí)符屬性應(yīng)為過(guò)程16 條件語(yǔ)句

12、中丟了"then"17 丟了"end"或""18 while型循環(huán)語(yǔ)句丟了"do"19 語(yǔ)句后的符號(hào)不正確20 應(yīng)為關(guān)系運(yùn)算符21 表達(dá)式內(nèi)標(biāo)識(shí)符屬性不能是過(guò)程22 表達(dá)式中漏掉右括號(hào)"("23 因子后的非法符號(hào)24 表達(dá)式的開(kāi)始符不能是此符號(hào)31 數(shù)越界補(bǔ)充說(shuō)明了:32 read或write語(yǔ)句括號(hào)中的標(biāo)識(shí)符不是變量33 read或write語(yǔ)句缺少右括號(hào)")"34 read或write語(yǔ)句缺少左括號(hào)"("35 read或write括號(hào)里應(yīng)為變量自己增加

13、了:45 +或-后面應(yīng)為變量46 repeat缺少u(mài)ntil47 for語(yǔ)句錯(cuò)誤48 for語(yǔ)句缺少do49 類(lèi)型值不匹配50 類(lèi)型無(wú)法轉(zhuǎn)換51 只有整數(shù)能+或-52 類(lèi)型不正確TESTSYM在S1中?打印出錯(cuò)編號(hào)nS1:=S1+S2SYM在S1中?GETSYM返回YYNNTEST測(cè)試過(guò)程流程圖五 設(shè)計(jì)過(guò)程(一) 實(shí)驗(yàn)內(nèi)容1.增加單詞:保留字 ELSE,F(xiàn)OR, TO, DOWNTO, REPEAT,UNTIL,RETURN運(yùn)算符 +=(PLUSBK), -=(MINUSBK), +(INC), - (DEC)首先要擴(kuò)展SYMBOL,在此基礎(chǔ)上再進(jìn)行其它細(xì)節(jié)的修改。要添加的SYMBOL為:ty

14、pedef enum NUL, IDENT, NUMBER, PLUS, MINUS, TIMES, SLASH, ODDSYM, EQL, NEQ, LSS, LEQ, GTR, GEQ, LPAREN, RPAREN, COMMA, SEMICOLON, PERIOD, BECOMES, BEGINSYM, ENDSYM, IFSYM, THENSYM, WHILESYM, WRITESYM, READSYM, DOSYM, CALLSYM, CONSTSYM, VARSYM, PROCSYM, PROGSYM, ELSESYM, FORSYM, TOSYM, DOWNTOSYM, REP

15、EATSYM, UNTILSYM, RETURNSYM, PLUSBK, MINUSBK, INC, DEC SYMBOL;char *SYMOUT = "NUL", "IDENT", "NUMBER", "PLUS", "MINUS", "TIMES", "SLASH", "ODDSYM", "EQL", "NEQ", "LSS", "LEQ", &quo

16、t;GTR", "GEQ", "LPAREN", "RPAREN", "COMMA", "SEMICOLON", "PERIOD", "BECOMES", "BEGINSYM", "ENDSYM", "IFSYM", "THENSYM", "WHILESYM", "WRITESYM", "READSYM",

17、"DOSYM", "CALLSYM", "CONSTSYM", "VARSYM", "PROCSYM", "PROGSYM", "ELSE","FOR", "TO", "DOWNTO", "REPEAT", "UNTIL", "RETURN", "PLUSBK", "MINUSBK", "

18、INC” "DEC" ;其中黑斜體為新加入的SYMBOL。再將"ELSE","FOR","TO","DOWNTO","REPEAT", "UNTIL", "RETURN", "PLUSBK", "MINUSBK", "INC","DEC"關(guān)鍵字加到KWORD和將相應(yīng)的SYM加到WSYM,按字母順序排列。以及修改NEQ 后如下void _fastcall TF

19、orm1:ButtonRunClick(TObject *Sender) for (CH=' ' CH<='' CH+) SSYMCH=NUL; strcpy(KWORD 1,"BEGIN"); strcpy(KWORD 2,"CALL"); strcpy(KWORD 3,"CONST"); strcpy(KWORD 4,"DEC"); strcpy(KWORD 5,"DO"); strcpy(KWORD 6," DOWHILE"); s

20、trcpy(KWORD 7," DOWNTO "); strcpy(KWORD 8,"ELSE"); strcpy(KWORD 9,"END"); strcpy(KWORD 10,"FOR"); strcpy(KWORD 11,"IF"); strcpy(KWORD12,"INC"); strcpy(KWORD13,"MINUSBK"); strcpy(KWORD14,"ODD"); strcpy(KWORD15,"PLUSB

21、K"); strcpy(KWORD16,"PROCEDURE"); strcpy(KWORD17,"PROGRAM"); strcpy(KWORD18,"READ"); strcpy(KWORD19,"REPEAT"); strcpy(KWORD20,"RETURN"); strcpy(KWORD21,"THEN"); strcpy(KWORD22,"TO"); strcpy(KWORD23,"VAR"); strcpy(KW

22、ORD24,"UNTIL");strcpy(KWORD25,"WHILE"); strcpy(KWORD26,"WRITE"); WSYM 1=BEGINSYM; WSYM 2=CALLSYM; WSYM 3=CONSTSYM; WSYM 4=DEC; WSYM 5=DOSYM; WSYM 6=DOWHILESYM; WSYM 7=DOWNTOSYMs; WSYM 8=ELSESYM; WSYM 9=ENDSYM; WSYM 10=FORSYM; WSYM 11=IFSYM; WSYM12=INCSYM; WSYM13=MINUSBK

23、; WSYM14=ODDSYM; WSYM15=PLUSBK; WSYM16=PROCSYM; WSYM17=PROGSYM; WSYM18=READSYM; WSYM19=REPEATSYM; WSYM20=RETURNSYM; WSYM21=THENSYM; WSYM 22=TOSYM;WSYM23=VARSYM; WSYM24=UNTILSYM; WSYM25=WHILESYM; WSYM26=WRITESYM; SSYM'+'=PLUS; SSYM'-'=MINUS; SSYM'*'=TIMES; SSYM'/'=SLAS

24、H; SSYM'('=LPAREN; SSYM')'=RPAREN; SSYM'='=EQL; SSYM','=COMMA; SSYM'.'=PERIOD; SSYM''=SEMICOLON;因?yàn)殛P(guān)鍵字增加到了26個(gè),所以令const NORW = 26;SYMBOL由原來(lái)的33個(gè)值擴(kuò)展為目前的44個(gè)值,SYMOUT也由原來(lái)的33個(gè)元素?cái)U(kuò)展為目前的44個(gè)元素.我用個(gè)SYMMAX來(lái)記錄SYMBOL值的個(gè)數(shù), 所以,除了Error函數(shù)中可能出現(xiàn)的作為參數(shù)的“33”不被替換為“44”外,其余的“33”均用

25、“SYMMAX”來(lái)替換。SYMBOL擴(kuò)展完畢。2. 修改單詞:不等號(hào)# 改為 <>只要修改GetSym()函數(shù)。當(dāng)編譯器檢測(cè)到當(dāng)前字符為“”時(shí),接著檢測(cè)下一個(gè)字符,如果是“”,則使SYM=NEQ。代碼修改如下:if (CH='<')GetCh();if (CH='=') SYM=LEQ; GetCh(); elseif (CH='>') SYM=NEQ; GetCh (); /增加<>為不等于號(hào);else SYM=LSS; 3. 增加條件語(yǔ)句的ELSE子句 該條件語(yǔ)法描述圖如下:語(yǔ)句只要在STATEMENT修改

26、如下代碼:case IFSYM:GetSym();CONDITION(SymSetUnion(SymSetNew(THENSYM,DOSYM),FSYS),LEV,TX);if (SYM=THENSYM) GetSym();else Error(16);CX1=CX; GEN(JPC,0,0);STATEMENT(SymSetUnion(SymSetNew(ELSESYM), FSYS), LEV, TX); if(SYM != ELSESYM) CODECX1.A=CX; /如果程序中沒(méi)有else語(yǔ)句,執(zhí)行JPC時(shí)跳到此地址 else /添加ELSE語(yǔ)句 GetSym(); CX2=CX;

27、GEN(JMP,0,0); /跳過(guò)else語(yǔ)句 CODECX1.A = CX; /如果程序中有else語(yǔ)句,執(zhí)行JPC時(shí)跳到此地址 STATEMENT(FSYS,LEV,TX); CODECX2.A = CX; /執(zhí)行完then語(yǔ)句后跳出 break;ELSE子句擴(kuò)充完畢。(二) 課程設(shè)計(jì)內(nèi)容1. 增加運(yùn)算符 +=,-=,+,-a) 詞法分析1) 在GetSym()中完成INC()、PLUSBK()的詞法分析,代碼修改如下:else if(CH = '+') GetCh(); if(CH = '=') /增加+= SYM = PLUSBK; GetCh(); e

28、lse if(CH = '+') /增加+ SYM = INC; GetCh(); else SYM = PLUS; 2) 在GetSym()中完成DEC()、MINUSBK()的詞法分析,代碼修改如下:else if(CH = '-') GetCh(); if(CH = '=') /增加-= SYM = MINUSBK; GetCh(); else if(CH = '-') /增加- SYM = DEC; GetCh(); else SYM = MINUS; b)擴(kuò)充 后+ 和 后- 操作存在INC和DEC操作的語(yǔ)法圖有如下兩個(gè)

29、:根據(jù)以上語(yǔ)法圖,我們只要對(duì)語(yǔ)句處理程序和因子處理程序進(jìn)行修改添加,即可實(shí)現(xiàn)增加 后INC 和 后DEC 操作,首先對(duì)語(yǔ)句處理程序STATEMENT進(jìn)行如下修改:Case IDENT:i=POSITION (ID,TX);if (i=0) Error(11);else if (TABLEi.KIND!=VARIABLE) /*ASSIGNMENT TO NON-VARIABLE*/Error(12); i=0; GetSym();if (SYM=BECOMES) GetSym (); EXPRESSION (FSYS, LEV, TX);if (i!=0) GEN(STO,LEV-TABLEi

30、.vp.LEVEL,TABLEi.vp.ADR); else if (SYM=INC) /語(yǔ)句中的+運(yùn)算 if (i!=0) GEN(LOD,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR); GEN(LIT,0,1); GEN(OPR,0,2); if (i!=0) GEN(STO,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR); GetSym(); else if (SYM=DEC) /語(yǔ)句中的-運(yùn)算 if (i!=0) GEN(LOD,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR); GEN (LIT,0,1); GEN (

31、OPR,0,3); if (i!=0) GEN(STO,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR); GetSym (); 在接受到SYM=IDENT后,如果SYM為INC,則主要執(zhí)行這四條指令:GEN(LOD,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR) 將IDENT的值放到棧頂,GEN(LIT,0,1); 將常數(shù)1放到棧頂,GEN(OPR,0,2) 次棧頂加棧頂,GEN(STO,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR);將棧頂內(nèi)容保存到IDENT中。這樣就完成了語(yǔ)句中的+運(yùn)算。如果SYM為DEC,則主要執(zhí)行這四條

32、指令:GEN(LOD,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR) 將IDENT的值放到棧頂,GEN(LIT,0,1); 將常數(shù)1放到棧頂,GEN(OPR,0,3) 次棧頂減棧頂,GEN(STO,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR);將棧頂內(nèi)容保存到IDENT中。這樣就完成了語(yǔ)句中的-運(yùn)算。其次,再對(duì)因子處理程序FACTOR修改如下:if (SYM=IDENT) i=POSITION(ID,TX); if (i=0) Error(11); elseswitch (TABLEi.KIND) case CONSTANT: GEN(LIT,0,

33、TABLEi.VAL);GetSym(); break; case VARIABLE: GEN(LOD,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR); GetSym(); if(SYM=INC|SYM=DEC) /因子中的+和-運(yùn)算 GEN(LIT,0,1); if(SYM=INC) GEN(OPR,0,2);/如果為INC,則加1 else GEN(OPR,0,3);/否則減一 GEN(STO,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR);/將棧頂送入變量單元 GEN(LOD,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR)

34、; /將變量送入棧頂 GetSym(); break; case PROCEDUR: Error(21); break;這樣,對(duì) 后INC 和 后DEC操作就擴(kuò)充完成c)擴(kuò)充 前+ 和 前- 操作存在 前INC 和 前DEC 操作的語(yǔ)法圖有如下兩個(gè):語(yǔ)句+indentindent首先將 STATBEGSYSINC=1; STATBEGSYSDEC=1; FACBEGSYSINC =1; FACBEGSYSDEC =1;其次根據(jù)以上語(yǔ)法圖,我們只要對(duì)語(yǔ)句處理程序和因子處理程序進(jìn)行修改添加,即可實(shí)現(xiàn)增加 前INC 和 前DEC 操作,首先對(duì)語(yǔ)句處理程序STATEMENT進(jìn)行如下修改:case IN

35、C: /前+ GetSym(); if (SYM = IDENT) i=POSITION(ID,TX); if (i=0) Error(11); else if (TABLEi.KIND!=VARIABLE) /*ASSIGNMENT TO NON-VARIABLE*/ Error(12); i=0; if (i!=0) GEN(LOD,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR); GEN(LIT,0,1); GEN(OPR,0,2); if (i!=0) GEN(STO,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR); GetSym(); el

36、se Error(45); break; case DEC: /前- GetSym(); if (SYM = IDENT) i=POSITION(ID,TX); if (i=0) Error(11); else if (TABLEi.KIND!=VARIABLE) /*ASSIGNMENT TO NON-VARIABLE*/ Error(12); i=0; if (i!=0) GEN(LOD,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR); GEN (LIT,0,1); GEN (OPR,0,3); if (i!=0) GEN(STO,LEV-TABLEi.vp.LEVE

37、L,TABLEi.vp.ADR); GetSym (); else Error(45); break;再次,再對(duì)因子處理程序FACTOR修改如下:因子+indentindentelse if(SYM = INC) /前+ GetSym(); if (SYM = IDENT) i=POSITION(ID,TX); if (i=0) Error(11); else if (TABLEi.KIND!=VARIABLE) /*ASSIGNMENT TO NON-VARIABLE*/ Error(12); i=0; if (i!=0) GEN(LOD,LEV-TABLEi.vp.LEVEL,TABLEi

38、.vp.ADR); GEN(LIT,0,1); GEN(OPR,0,2); if (i!=0) GEN(STO,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR); /將棧頂送入變量單元 GEN(LOD,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR); /將變量送入棧頂 GetSym(); else Error(45); else if(SYM = DEC) /前- GetSym(); if (SYM = IDENT) i=POSITION(ID,TX); if (i=0) Error(11); else if (TABLEi.KIND!=VARIABL

39、E) /*ASSIGNMENT TO NON-VARIABLE*/ Error(12); i=0; if (i!=0) GEN(LOD,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR); GEN (LIT,0,1); GEN (OPR,0,3); if (i!=0) GEN(STO,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR); /將棧頂送入變量單元 GEN(LOD,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR); /將變量送入棧頂 GetSym (); else Error(45); d)擴(kuò)充 += 和 -= 操作這兩個(gè)操作都

40、是一種對(duì)變量進(jìn)行賦值的形式,其合法的語(yǔ)句形式的語(yǔ)法圖如下所示:根據(jù)圖3,在語(yǔ)句處理STATEMENT中,在已經(jīng)處理INC和DEC的基礎(chǔ)上,添加對(duì)PLUSBK()運(yùn)算和MINUSBK()運(yùn)算的擴(kuò)充,相關(guān)代碼添加如下:else if (SYM=PLUSBK) /增加運(yùn)算符+= if (i!=0) GEN(LOD,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR); GetSym(); EXPRESSION(FSYS,LEV,TX); GEN(OPR,0,2); if (i!=0) GEN(STO,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR); else i

41、f (SYM=MINUSBK) /增加運(yùn)算符-= if (i!=0) GEN(LOD,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR); GetSym(); EXPRESSION(FSYS,LEV,TX); GEN(OPR,0,3); if (i!=0) GEN(STO,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR); 這樣就完成了對(duì)運(yùn)算和運(yùn)算的添加。2.增加Pascal的FOR語(yǔ)句:a)格式如下:FOR <變量> := <常數(shù)>TO(或DOWNTO) <常數(shù)>DO <語(yǔ)句>b)添加語(yǔ)句for 語(yǔ)句的語(yǔ)句

42、語(yǔ)法圖如下:首先,詞法分析部分增加關(guān)鍵字在SYMBOL里增加FORSYM, TOSYM, DOWNTOSYM,對(duì)應(yīng)SYMMAX=44 ; NORW = 25;初始化中strcpy(KWORD10,"FOR"); WSYM 10=IFSYM;strcpy(KWORD22,"TO"); WSYM22=TOSYM;strcpy(KWORD 7,"DOWNTO"); WSYM 7=DOWNTOSYM;其次,修改STATEMENT,代碼如下: case FORSYM: /添加FOR語(yǔ)句。 GetSym(); if(SYM != IDENT) E

43、rror(47); else i=POSITION(ID,TX);if(i = 0) Error(11);else if (TABLEi.KIND!=VARIABLE) /*ASSIGNMENT TO NON-VARIABLE*/Error(12); i=0; GetSym(); if(SYM = BECOMES) GetSym();else Error(13);EXPRESSION(SymSetUnion(SymSetNew(TOSYM,DOWNTOSYM),FSYS),LEV,TX);if(i != 0) GEN(STO,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR)

44、; if(SYM = TOSYM) /如果是to語(yǔ)句 CX1=CX;/記錄當(dāng)前地址入口 GEN(LOD,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR); /取ident變量值到棧頂 GetSym(); EXPRESSION(SymSetUnion(SymSetNew(DOSYM),FSYS),LEV,TX); /取表達(dá)式值到棧頂 GEN(OPR,0,13);/判斷變量是否小于或等于棧頂 CX2=CX;GEN(JPC,0,0); GEN(LOD,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR); GEN(LIT,0,1); GEN(OPR,0,2); G

45、EN(STO,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR);/變量加一 if(SYM = DOSYM)/執(zhí)行DO后的語(yǔ)句 GetSym(); STATEMENT(FSYS,LEV,TX); else Error(48); GEN(JMP,0,CX1); CODECX2.A=CX; else if (SYM=DOWNTOSYM) /如果為down語(yǔ)句 CX1=CX; GEN(LOD,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR); GetSym(); EXPRESSION(SymSetUnion(SymSetNew(DOSYM),FSYS),LEV,

46、TX); GEN(OPR,0,11);/變量大于或等于棧頂 CX2=CX;GEN(JPC,0,0); GEN(LOD,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR); GEN(LIT,0,1); GEN(OPR,0,3); GEN(STO,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR);/變量減一 if (SYM=DOSYM)/執(zhí)行DO后的語(yǔ)句 GetSym(); STATEMENT(FSYS,LEV,TX); else Error(48); GEN(JMP,0,CX1); CODECX2.A=CX; else Error(47); break; /

47、添加FOR語(yǔ)句。FOR語(yǔ)句擴(kuò)充完畢。3.增加一維數(shù)組類(lèi)型首先設(shè)置一維數(shù)組的左右括號(hào):ssym''=lepa;/一維數(shù)組的左括號(hào)ssym''=ripa;/一維數(shù)組的右括號(hào)增加指令:strcpy(&(mnemonicgar0),"gar"); /根據(jù)棧頂?shù)钠频刂窂臄?shù)組中取值到新的棧頂strcpy(&(mnemonicsar0),"sar");/根據(jù)次棧頂?shù)钠频刂钒褩m數(shù)闹荡嫒霐?shù)組strcpy(&(mnemonicshd0),"shd");/將棧頂?shù)闹迪乱频酱螚m?,棧頂出棧,即次棧頂成為棧頂strcpy(&(mnemonicdel0),"del&

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論