版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 課 程 設(shè) 計(jì)</b></p><p> 課程名稱 編譯原理 </p><p> 題目名稱 PL/0編譯器的擴(kuò)充 </p><p> 學(xué)生學(xué)院 計(jì)算機(jī)學(xué)院 </p><p> 專業(yè)班級(jí) 計(jì)算機(jī)科學(xué)與技術(shù)12(4)</p>
2、<p> 2014 年 12 月 28日</p><p><b> 實(shí)驗(yàn)?zāi)康呐c要求</b></p><p> 基本內(nèi)容(成績(jī)范圍:“中”、“及格”或“不及格”)</p><p> ?。?)擴(kuò)充賦值運(yùn)算:*= 和 /=</p><p> (2)擴(kuò)充語(yǔ)句(Pascal的FOR語(yǔ)句):</p>
3、<p> FOR <變量>:=<表達(dá)式>STEP<表達(dá)式> UNTIL<表達(dá)式>Do<語(yǔ)句></p><p> 選做內(nèi)容(成績(jī)?cè)u(píng)定范圍擴(kuò)大到:“優(yōu)”和“良”)</p><p> ?。?)增加類型:① 字符類型; ② 實(shí)數(shù)類型。</p><p> (2)增加 注釋; 注釋由
4、/*和*/包含;</p><p> ?。?)擴(kuò)充函數(shù):① 有返回值和返回語(yǔ)句;② 有參數(shù)函數(shù)。</p><p> ?。?)增加一維數(shù)組類型(可增加指令)。</p><p> ?。?)其他典型語(yǔ)言設(shè)施。</p><p><b> 實(shí)驗(yàn)環(huán)境與工具</b></p><p> 1、源語(yǔ)言:PL/0語(yǔ)言
5、,PL/0語(yǔ)言是PASCAL語(yǔ)言的子集,它的編譯程序是一個(gè)編譯解析執(zhí)行系統(tǒng),后綴名為.PL0;</p><p> 2、目標(biāo)語(yǔ)言:生成文件后綴為*.COD的目標(biāo)代碼</p><p> 3、實(shí)現(xiàn)平臺(tái):Borland C++Builder 6</p><p> 4、運(yùn)行平臺(tái):Windows 8.1</p><p><b> 設(shè)計(jì)概
6、述</b></p><p><b> 結(jié)構(gòu)設(shè)計(jì)說(shuō)明</b></p><p> ?。?)PL/0編譯系統(tǒng)的結(jié)構(gòu)框架</p><p> 源語(yǔ)言:源語(yǔ)言是基于C語(yǔ)言寫的PL/0編譯程序——PL0語(yǔ)言(可 以看成 Pascal語(yǔ)言的子集)</p><p> 目標(biāo)語(yǔ)言:假想的棧式計(jì)算機(jī)計(jì)算語(yǔ)言,即類PC
7、ODE指令代碼。</p><p><b> 指令格式如下:</b></p><p> 其中f代表功能碼,l表示層次差,a的含意對(duì)不同的指令有所區(qū)別。</p><p><b> 具體的指令功能表:</b></p><p><b> 設(shè)計(jì)分析</b></p>
8、<p> 擴(kuò)充賦值運(yùn)算:*= 和 /=</p><p> 需要增加2個(gè)運(yùn)算符*= 和 /=,用下面表格定義的SYM代替</p><p> *= 和 /=的語(yǔ)法描述圖:</p><p> 擴(kuò)充語(yǔ)句(Pascal的FOR語(yǔ)句)</p><p> 因?yàn)樵赑ascal中的FOR語(yǔ)句描述為:</p><p>
9、 FOR <變量>:=<表達(dá)式> STEP <表達(dá)式> UNTIL <表達(dá)式> DO <語(yǔ)句></p><p> 所以增加FOR,STEP,UNTIL,DO</p><p> FOR語(yǔ)句語(yǔ)法描述圖為:</p><p><b> 程序設(shè)計(jì)</b></p><p
10、> 增加所需要的保留字和運(yùn)算符,實(shí)現(xiàn)*=和/=,以及FOR語(yǔ)句,應(yīng)該增加TIMESBECOMES,SLASHBECOMES,F(xiàn)OR,STEP,UNTIL,DO。</p><p> 注:因?yàn)橐笳n設(shè)和之前實(shí)驗(yàn)的內(nèi)容合并在一起,所以保留了課程實(shí)驗(yàn)已經(jīng)添加的保留字和運(yùn)算符,之前的已經(jīng)添加了的不再贅述。</p><p> 具體實(shí)現(xiàn)的語(yǔ)句如下所示:</p><p>
11、; typedef enum {NUL, IDENT, NUMBER, PLUS, MINUS, TIMES,</p><p> SLASH, ODDSYM, EQL, NEQ, LSS, LEQ, GTR, GEQ,</p><p> LPAREN, RPAREN, COMMA, SEMICOLON, PERIOD,</p><p> BECOMES,
12、BEGINSYM, ENDSYM, IFSYM, THENSYM,</p><p> WHILESYM, WRITESYM, READSYM, DOSYM, CALLSYM,</p><p> CONSTSYM, VARSYM, PROCSYM, PROGSYM,ELSESYM,</p><p> FORSYM,STEPSYM,UNTILSYM,RETURNS
13、YM,</p><p> TIMESBECOMES,SLASHBECOMES,ANDSYM,ORSYM,NOTSYM</p><p><b> } SYMBOL;</b></p><p> 這里需要考慮需要增加保留字的個(gè)數(shù),以及如何命名,再將新增的保留字添加對(duì)應(yīng)的保留字的集合中。具體實(shí)現(xiàn)的語(yǔ)句如下所示:</p><p&
14、gt; char *SYMOUT[] = {"NUL", "IDENT", "NUMBER", "PLUS", "MINUS", "TIMES",</p><p> "SLASH", "ODDSYM", "EQL", "N
15、EQ", "LSS", "LEQ", "GTR", "GEQ",</p><p> "LPAREN", "RPAREN", "COMMA", "SEMICOLON", "PERIOD",</p><p&g
16、t; "BECOMES", "BEGINSYM", "ENDSYM", "IFSYM", "THENSYM",</p><p> "WHILESYM", "WRITESYM", "READSYM", "DOSYM", "C
17、ALLSYM",</p><p> "CONSTSYM", "VARSYM", "PROCSYM", "PROGSYM" ,"ELSESYM",</p><p> "FORSYM","STEPSYM","UNTILSYM&quo
18、t;,"RETURNSYM","TIMESBECOMES",</p><p> "SLASHBECOMES", "ANDSYM", "ORSYM", "NOTSYM"};</p><p> 將新增的保留字按照字母表升序的方式添加,運(yùn)算符參照已有的運(yùn)算符來(lái)進(jìn)行添加,注意
19、好符號(hào)與SYM的對(duì)應(yīng)。具體實(shí)現(xiàn)的語(yǔ)句如下所示:</p><p> 特別注意點(diǎn):此處一定要考慮到PLO編譯器采用了折半查找算法來(lái)進(jìn)行操作,如果新增的保留字沒(méi)有按照既定的升序規(guī)則來(lái)插入,會(huì)造成在編譯過(guò)程中,編譯器無(wú)法識(shí)別某些保留字。</p><p> strcpy(KWORD[ 1],"BEGIN"); strcpy(KWORD[ 2],"CALL&qu
20、ot;);</p><p> strcpy(KWORD[ 3],"CONST"); strcpy(KWORD[ 4],"DO");</p><p> strcpy(KWORD[ 5],"ELSE");</p><p> strcpy(KWORD[ 6],"END");<
21、/p><p> strcpy(KWORD[ 7],"FOR");</p><p> strcpy(KWORD[ 8],"IF");</p><p> strcpy(KWORD[ 9],"ODD"); strcpy(KWORD[ 10],"PROCEDURE");</p&
22、gt;<p> strcpy(KWORD[ 11],"PROGRAM"); strcpy(KWORD[12],"READ");</p><p> strcpy(KWORD[13],"RETURN");</p><p> strcpy(KWORD[14],"STEP");</p>
23、<p> strcpy(KWORD[15],"THEN");</p><p> strcpy(KWORD[16],"UNTIL");</p><p> strcpy(KWORD[17],"VAR");</p><p> strcpy(KWORD[18],"WHILE"
24、;); strcpy(KWORD[19],"WRITE");</p><p> WSYM[ 1]=BEGINSYM; WSYM[ 2]=CALLSYM;</p><p> WSYM[ 3]=CONSTSYM; WSYM[ 4]=DOSYM;</p><p> WSYM[ 5]=ELSESYM; </p>&l
25、t;p> WSYM[ 6]=ENDSYM;</p><p> WSYM[ 7]=FORSYM;</p><p> WSYM[ 8]=IFSYM;</p><p> WSYM[ 9]=ODDSYM; WSYM[ 10]=PROCSYM;</p><p> WSYM[ 11]=PROGSYM; WSYM[12]=RE
26、ADSYM;</p><p> WSYM[13]=RETURNSYM;</p><p> WSYM[14]=STEPSYM;</p><p> WSYM[15]=THENSYM;</p><p> WSYM[16]=UNTILSYM;</p><p> WSYM[17]=VARSYM;</p>
27、<p> WSYM[18]=WHILESYM; WSYM[19]=WRITESYM;</p><p> SSYM['+']=PLUS; SSYM['-']=MINUS;</p><p> SSYM['*']=TIMES; SSYM['/']=SLASH;</p><p&
28、gt; SSYM['(']=LPAREN; SSYM[')']=RPAREN;</p><p> SSYM['=']=EQL; SSYM[',']=COMMA;</p><p> SSYM['.']=PERIOD;</p><p> SSYM[';
29、9;]=SEMICOLON;</p><p> SSYM['&']=ANDSYM;</p><p> SSYM['|']=ORSYM;</p><p> SSYM['!']=NOTSYM;</p><p> 特別需要注意的兩點(diǎn),這個(gè)是很容易被忽略的地方,就是在完成保留字和運(yùn)算符的
30、增加以后,一定要對(duì)PLO編譯器對(duì)保留字個(gè)數(shù)已經(jīng)單詞總數(shù)定義進(jìn)行相應(yīng)的修改。</p><p><b> 保留字總數(shù)</b></p><p> 比如說(shuō)在不添加任何保留字的情況下,PL0編譯器的原保留字應(yīng)該是14個(gè),所以在Unit1.CPP中有定義const NORW = 14; /* # OF RESERVED WORDS */</p><
31、p> 而在實(shí)驗(yàn)中因?yàn)樾略黾颖A糇?個(gè),故此處應(yīng)改為:</p><p> const NORW = 19; /* # OF RESERVED WORDS */</p><p><b> 單詞總數(shù)</b></p><p> 與保留字總數(shù)一樣,我們?cè)黾油瓯A糇趾瓦\(yùn)算符以后,要修改單詞總是,比如原單詞總數(shù)是33,因?yàn)樵幾g器中并未
32、定義一個(gè)常量來(lái)進(jìn)行統(tǒng)一管理,所以需要對(duì)所有“i<33”的地方進(jìn)行修改。因?yàn)閷?shí)驗(yàn)中新增加單詞10個(gè),故應(yīng)改為“i<43”。</p><p> 如下面代碼所示舉例:</p><p> SYMSET SymSetUnion(SYMSET S1, SYMSET S2) {</p><p> SYMSET S=(SYMSET)malloc(sizeof(in
33、t)*43);</p><p> for (int i=0; i<43; i++)</p><p> if (S1[i] || S2[i]) S[i]=1;</p><p> else S[i]=0;</p><p><b> return S;</b></p><p><b&
34、gt; }</b></p><p> 特別是這個(gè)地方也要更改數(shù)目為43,不然會(huì)發(fā)生異常信息。</p><p> DECLBEGSYS=(int*)malloc(sizeof(int)*43);</p><p> STATBEGSYS=(int*)malloc(sizeof(int)*43);</p><p> FACBE
35、GSYS =(int*)malloc(sizeof(int)*43);</p><p> for(int j=0; j<43; j++) {</p><p> DECLBEGSYS[j]=0; STATBEGSYS[j]=0; FACBEGSYS[j] =0;</p><p><b> }</b></p><
36、p> 體會(huì):在這里的細(xì)節(jié)導(dǎo)致出現(xiàn)了很多意料不到的問(wèn)題,很多時(shí)候調(diào)試了很久才發(fā)現(xiàn),有些地方漏改了,其實(shí)可以考慮設(shè)置一個(gè)全局變量,進(jìn)行統(tǒng)一修改,不過(guò)考慮到對(duì)編譯器增加全局變量不是很好的一種方式,難免會(huì)發(fā)生出現(xiàn)可能的篡改,而且不夠直觀,故只是在原來(lái)基礎(chǔ)上做出修改。</p><p> 新增的運(yùn)算符需要被編譯器識(shí)別,必須滿足編譯器做詞法分析時(shí),能夠正確得到對(duì)應(yīng)的SYM,因此在GetSym()函數(shù)中在相應(yīng)位置增加相
37、應(yīng)的運(yùn)算符分析判斷,具體實(shí)現(xiàn)如下面所示的語(yǔ)句:</p><p><b> else</b></p><p> if(CH=='*'){</p><p><b> GetCh();</b></p><p> if(CH=='=') {SYM=TIMESBECOM
38、ES; GetCh();}</p><p> else SYM=TIMES;}</p><p><b> else</b></p><p> if(CH=='/'){</p><p><b> GetCh();</b></p><p> if(CH=
39、='='){SYM=SLASHBECOMES;</p><p><b> GetCh();}</b></p><p> else SYM=SLASH;}</p><p> 體會(huì):這里是雙字符判斷,需要注意判別的連貫性,處理不同情況下對(duì)于的SYM或者報(bào)錯(cuò)方式。</p><p> 完成*=和/=的語(yǔ)法
40、分析以后,需要考慮其語(yǔ)義的實(shí)現(xiàn),也就是考慮如何實(shí)現(xiàn)語(yǔ)句的處理,這里根據(jù)前面設(shè)計(jì)的語(yǔ)法描述圖來(lái)進(jìn)行相應(yīng)的語(yǔ)句分析。</p><p> 依據(jù)語(yǔ)法描述圖,首選找到STATEMENT函數(shù)中IDENT語(yǔ)句體,即case IDENT:語(yǔ)句中加入對(duì)*=和/=的語(yǔ)句描述。注意這里有三種情況,要考慮到相互不能影響。表達(dá)式的分析采用EXPRESSION(FSYS,LEV,TX);語(yǔ)句就行。</p><p>
41、<b> 從指令功能表可知:</b></p><p> OPR,0,4代表次棧頂乘以棧頂,退兩個(gè)棧元素,結(jié)果值進(jìn)棧</p><p> OPR,0,5代表次棧頂除以棧頂,退兩個(gè)棧元素,結(jié)果值進(jìn)棧</p><p> 一定要注意是次棧頂對(duì)棧頂?shù)牟僮?,所以要注意被除?shù)(被乘數(shù))和除數(shù)(乘數(shù))的入棧的先后次序,不可顛倒。</p>&
42、lt;p> case IDENT:</p><p> i=POSITION(ID,TX);</p><p> if (i==0) Error(11);</p><p><b> else</b></p><p> if (TABLE[i].KIND!=VARIABLE) { /*ASSIGNMENT
43、TO NON-VARIABLE*/</p><p> Error(12); i=0;</p><p><b> }</b></p><p><b> GetSym();</b></p><p> if (SYM==BECOMES||TIMESBECOMES||SLASHBECOMES)<
44、;/p><p><b> {</b></p><p> OPSYM=SYM;</p><p> if (SYM==TIMESBECOMES)</p><p><b> {</b></p><p> GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[
45、i].vp.ADR); //取值到棧頂</p><p><b> }</b></p><p> else if (SYM==SLASHBECOMES)</p><p><b> {</b></p><p> GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp
46、.ADR); //取值到棧頂</p><p><b> }</b></p><p> GetSym(); }</p><p> else Error(13);</p><p> EXPRESSION(FSYS,LEV,TX);</p><p> if (OPSYM == TIMESBEC
47、OMES)</p><p><b> {</b></p><p> GEN(OPR,0,4); // OPR,0,4代表次棧頂乘以棧頂,退兩個(gè)棧元素,結(jié)果值進(jìn)棧</p><p><b> }</b></p><p> else if (OPSYM == SLASHBECOMES)</p
48、><p><b> {</b></p><p> GEN(OPR,0,5); // OPR,0,5代表次棧頂除以棧頂,退兩個(gè)棧元素,結(jié)果值進(jìn)棧</p><p><b> }</b></p><p><b> if (i!=0)</b></p><p>
49、;<b> {</b></p><p> GEN(STO,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);</p><p><b> }</b></p><p><b> break;</b></p><p> 體會(huì):這里在調(diào)試過(guò)程中發(fā)現(xiàn)
50、了編譯程序中的一個(gè)BUG:</p><p> 當(dāng)我測(cè)試除等運(yùn)算時(shí),發(fā)現(xiàn)目標(biāo)代碼的生成沒(méi)有問(wèn)題,可是結(jié)果變成了取余運(yùn)算,調(diào)試許久以后,才發(fā)現(xiàn)原來(lái)在編譯器源碼中Interpret()函數(shù)的語(yǔ)句中的除運(yùn)算變成了取余運(yùn)算。也就造成了OPR 0,5語(yǔ)句本來(lái)應(yīng)該是表示除運(yùn)算指令,變成了取余運(yùn)算指令。</p><p> 所以把該語(yǔ)句修改為:</p><p> case 5:
51、 T--; S[T]=S[T] / S[T+1]; break;</p><p> 結(jié)果就可以正常輸出。所以面對(duì)這種BUG,還好老師提醒一下,才發(fā)現(xiàn)是這個(gè)原因。</p><p> 在增加了所有FOR循環(huán)需要的保留字以后,根據(jù)FOR循環(huán)的語(yǔ)法描述進(jìn)行語(yǔ)義分析。因?yàn)樵赑ascal中的FOR語(yǔ)句描述為:FOR <變量>:=<表達(dá)式> STEP <表達(dá)式>
52、UNTIL <表達(dá)式> DO <語(yǔ)句>。所以按照這個(gè)語(yǔ)義,進(jìn)行相應(yīng)的語(yǔ)句處理。</p><p> case FORSYM:</p><p><b> GetSym();</b></p><p> if (SYM!=IDENT) Error(13);//是否為 變量符號(hào)</p><p><
53、;b> else {</b></p><p> i=POSITION(ID,TX);</p><p> if (i==0) Error(11);</p><p> else if (TABLE[i].KIND!=VARIABLE) //賦值語(yǔ)句中,賦值左部標(biāo)識(shí)符是變量</p><p> { Error(12); i
54、=0; }</p><p><b> GetSym();</b></p><p> if(SYM!=BECOMES) Error(13);</p><p><b> else {</b></p><p><b> GetSym();</b></p>&
55、lt;p> /*處理賦值語(yǔ)句右部的表達(dá)式*/</p><p> EXPRESSION(SymSetUnion(SymSetNew(UNTILSYM,STEPSYM,DOSYM),FSYS),LEV,TX);</p><p><b> if(i!=0)</b></p><p> GEN(STO,LEV-TABLE[i].vp.LEV
56、EL,TABLE[i].vp.ADR); //保持初始值</p><p> CX1=CX;//如果是賦值語(yǔ)句,跳轉(zhuǎn)到untilsym執(zhí)行</p><p> GEN(JMP,0,0);</p><p> CX2=CX; //保持循環(huán)開始點(diǎn)</p><p> if(SYM!=STEPSYM) Error(19);</p>&
57、lt;p><b> else{</b></p><p><b> GetSym();</b></p><p> EXPRESSION(SymSetUnion(SymSetNew(UNTILSYM,STEPSYM,DOSYM),FSYS),LEV,TX);</p><p> GEN(LOD,LEV-TABLE[
58、i].vp.LEVEL,TABLE[i].vp.ADR); //循環(huán)變量放到棧頂</p><p> GEN(OPR,0,2);</p><p> GEN(STO,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);//將棧頂?shù)闹捣湃胙h(huán)變量</p><p> //GetSym();</p><p> if(S
59、YM!=UNTILSYM) Error(19);</p><p><b> else{</b></p><p> CODE[CX1].A=CX; //如果是賦值語(yǔ)句,跳轉(zhuǎn)到untilsym執(zhí)行</p><p><b> GetSym();</b></p><p> EXPRESSION(Sy
60、mSetUnion(SymSetNew(UNTILSYM,STEPSYM,DOSYM),FSYS),LEV,TX);</p><p> GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);</p><p> GEN(OPR,0,12); //次棧頂是否比棧頂小,是,1進(jìn)棧,否,0進(jìn)棧</p><p><b>
61、 CX3=CX;</b></p><p> GEN(JPC,0,0);// 棧頂布爾值非0則轉(zhuǎn)移</p><p> if(SYM=DOSYM) {</p><p><b> GetSym();</b></p><p> STATEMENT(FSYS,LEV,TX);</p><p&
62、gt; GEN(JMP,0,CX2);//跳回step</p><p> CODE[CX3].A=CX;</p><p><b> }</b></p><p> else Error(19);</p><p><b> }}}}</b></p><p><b&
63、gt; //跳出for循環(huán)</b></p><p><b> break;</b></p><p> 體會(huì):這里的語(yǔ)句分析的次序應(yīng)該是按照語(yǔ)句出現(xiàn)的先后,而不是語(yǔ)義的先后,不然邏輯很難處理,而且根據(jù)循環(huán)的方式,進(jìn)行相應(yīng)的跳轉(zhuǎn)回填操作比較多,因?yàn)橐笫菍?duì)表達(dá)式進(jìn)行操作,所以EXPRESSION()語(yǔ)句的處理也比較多。</p><p&
64、gt;<b> 測(cè)試用例</b></p><p> 因?yàn)檫@個(gè)整合了前面課程實(shí)驗(yàn)和課程設(shè)計(jì)的全部?jī)?nèi)容,因此對(duì)代碼的檢測(cè)也寫了很多的測(cè)試用例。</p><p><b> 下面是相關(guān)說(shuō)明:</b></p><p><b> 運(yùn)行結(jié)果</b></p><p> 測(cè)試/=運(yùn)算(
65、結(jié)果截圖,測(cè)試用例E05.PL0)</p><p><b> 運(yùn)行代碼截圖:</b></p><p><b> 結(jié)果輸出截圖:</b></p><p> 測(cè)試*=運(yùn)算(結(jié)果截圖,測(cè)試用例E06.PL0)</p><p><b> 結(jié)果輸出截圖:</b></p>
66、;<p><b> 目標(biāo)代碼生成:</b></p><p><b> 0 JMP 0 1</b></p><p><b> 1 INI 0 7</b></p><p><b> 2 LIT 0 4</b></p><p><b&
67、gt; 3 STO 0 5</b></p><p> 4 OPR 0 16</p><p><b> 5 STO 0 3</b></p><p> 6 OPR 0 16</p><p><b> 7 STO 0 4</b></p><p><b&g
68、t; 8 LOD 0 3</b></p><p><b> 9 LIT 0 1</b></p><p> 10 OPR 0 2</p><p> 11 STO 0 6</p><p> 12 JMP 0 19</p><p> 13 LOD 0 4</p>&
69、lt;p> 14 LIT 0 2</p><p> 15 OPR 0 2</p><p> 16 LOD 0 6</p><p> 17 OPR 0 2</p><p> 18 STO 0 6</p><p> 19 LOD 0 3</p><p> 20 LIT 0 10&
70、lt;/p><p> 21 OPR 0 2</p><p> 22 LOD 0 6</p><p> 23 OPR 0 12</p><p> 24 JPC 0 31</p><p> 25 LOD 0 5</p><p> 26 LOD 0 6</p><p>
71、 27 OPR 0 4</p><p> 28 OPR 0 14</p><p> 29 OPR 0 15</p><p> 30 JMP 0 13</p><p> 31 OPR 0 0</p><p> 測(cè)試FOR循環(huán)語(yǔ)句(結(jié)果截圖,測(cè)試用例E07.PL0)</p><p>&l
72、t;b> 結(jié)果輸出截圖:</b></p><p><b> 心得體會(huì)</b></p><p> 總的來(lái)說(shuō),編譯原理課程設(shè)計(jì),難度挺大,加上本身時(shí)間比較重疊,所以很多問(wèn)題都沒(méi)有時(shí)間去嘗試。而且也遇到像編譯器存在某些小BUG的問(wèn)題(比如OPR 0,5),導(dǎo)致調(diào)試了很久,才發(fā)現(xiàn)問(wèn)題不在自己的代碼。最印象深刻的是對(duì)FOR語(yǔ)句的處理,因?yàn)镕OR語(yǔ)句的語(yǔ)義
73、分析比較繁瑣,老師雖然在課堂講了兩次,也聽明白了,但是實(shí)際動(dòng)手還是發(fā)現(xiàn)有比較大的困難。這也在一些方面體現(xiàn)了知識(shí)的活學(xué)活用還是不夠。</p><p> 對(duì)于編譯原理這門課,我覺得考慮問(wèn)題的分析方式還是很有意思,也對(duì)如何編譯這個(gè)過(guò)程的處理有了一個(gè)大致的摸索。切實(shí)的進(jìn)行編譯器編程之后,對(duì)這個(gè)編譯器如何實(shí)現(xiàn)我們的代碼轉(zhuǎn)換有了新的認(rèn)識(shí),站在這個(gè)基礎(chǔ)上去理解高級(jí)語(yǔ)言的語(yǔ)法分析的過(guò)程,去想象高級(jí)語(yǔ)言的語(yǔ)義分析的思路,對(duì)自己的
74、編程感悟也有了一些提高。</p><p> 編譯原理實(shí)驗(yàn)是一個(gè)要很注意細(xì)節(jié)的事情,因?yàn)樵谔幚砑?xì)節(jié)上必須注意,比如我在處理保留字?jǐn)?shù)量和單詞數(shù)量上就一直摸索了好久,期間也造成了一些像內(nèi)存溢出,無(wú)法識(shí)別保留字的錯(cuò)誤。而對(duì)于像FOR語(yǔ)句,主要是對(duì)于語(yǔ)義處理,和語(yǔ)句之間的銜接跳轉(zhuǎn)回調(diào)的理解。</p><p> 總之,編譯原理是一門需要細(xì)心和耐心的學(xué)科,對(duì)于我們理解高級(jí)語(yǔ)言的實(shí)現(xiàn)由很大的促進(jìn)。衷心
溫馨提示
- 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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 編譯原理課程設(shè)計(jì)-pl_0編譯器及其擴(kuò)充
- 編譯原理課程設(shè)計(jì)-- pl0語(yǔ)言的擴(kuò)充
- 編譯原理課程設(shè)計(jì)---pl0編輯器擴(kuò)充
- 編譯原理課程設(shè)計(jì)--對(duì)pl0進(jìn)行擴(kuò)充和修改
- 編譯原理課程設(shè)計(jì)--對(duì)pl0進(jìn)行擴(kuò)充和修改
- pl0擴(kuò)展編譯器_設(shè)計(jì)文檔
- 編譯原理pl0課程設(shè)計(jì)報(bào)告
- 編譯原理課程設(shè)計(jì)--對(duì)PL0進(jìn)行擴(kuò)充和修改.doc
- 編譯原理課程設(shè)計(jì)報(bào)告_編譯器
- 編譯原理課程設(shè)計(jì)報(bào)告---pl0編譯程序改進(jìn)及完善
- 編譯原理課程設(shè)計(jì)--編譯器
- 編譯原理課程設(shè)計(jì)報(bào)告--編譯器實(shí)現(xiàn)
- 編譯原理課程設(shè)計(jì)---編譯器的實(shí)現(xiàn)
- 編譯原理實(shí)驗(yàn)報(bào)告pl0
- 編譯原理課程設(shè)計(jì)報(bào)告---編譯器功能的實(shí)現(xiàn)
- 編譯原理課程設(shè)計(jì)--c語(yǔ)言編譯器實(shí)現(xiàn)
- 編譯原理課程設(shè)計(jì)--c語(yǔ)言編譯器實(shí)現(xiàn)
- c語(yǔ)言編譯器實(shí)現(xiàn)-編譯原理課程設(shè)計(jì)
- 課程設(shè)計(jì)---pl0功能擴(kuò)充
- 編譯原理課程設(shè)計(jì)____c語(yǔ)言編譯器的實(shí)現(xiàn)-
評(píng)論
0/150
提交評(píng)論