2023年全國(guó)碩士研究生考試考研英語(yǔ)一試題真題(含答案詳解+作文范文)_第1頁(yè)
已閱讀1頁(yè),還剩14頁(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、<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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論