2023年全國(guó)碩士研究生考試考研英語(yǔ)一試題真題(含答案詳解+作文范文)_第1頁(yè)
已閱讀1頁(yè),還剩11頁(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>  題目名稱__對(duì)PL0進(jìn)行擴(kuò)充和修改</p><p>  學(xué)生學(xué)院__計(jì)算機(jī)學(xué)院 ________</p><p>  專業(yè)班級(jí)__計(jì)算機(jī)科學(xué)與技術(shù)___</p><

2、;p>  學(xué) 號(hào) 3106006475 </p><p>  學(xué)生姓名___楊振風(fēng) __ _______</p><p>  指導(dǎo)教師__ 吳偉民____________</p><p>  2009 年 1 月 7 日</p><p><b>  課程設(shè)計(jì)概述</b><

3、;/p><p>  PL0語(yǔ)言是Pascal語(yǔ)言的一個(gè)子集,它的編譯程序是一個(gè)編譯解釋執(zhí)行系統(tǒng),PL0的目標(biāo)程序?yàn)榧傧霔J接?jì)算機(jī)的匯編語(yǔ)言,與具體的計(jì)算機(jī)無(wú)關(guān)。編譯程序采用一趟掃描方式,已語(yǔ)法語(yǔ)義分析程序?yàn)楹诵?,詞法分析程序和代碼生成的程序都作為一個(gè)獨(dú)立的過(guò)程,當(dāng)語(yǔ)法分析需要讀單詞的時(shí)候就調(diào)用詞法分析程序,而當(dāng)語(yǔ)法分析正確需要生成相應(yīng)的目標(biāo)代碼時(shí)候 ,就調(diào)用代碼生成程序。此外用表格管理程序建立變量,常量和過(guò)程標(biāo)識(shí)符的

4、說(shuō)明與引用之間的信息聯(lián)系,用出錯(cuò)處理程序?qū)υ~法和語(yǔ)義分析遇到的錯(cuò)誤給出在源程序中出錯(cuò)的位置和錯(cuò)誤性質(zhì)。</p><p>  本課程設(shè)計(jì)通過(guò)對(duì)PL/0(C語(yǔ)言版)進(jìn)行修改和添加功能完成設(shè)計(jì),通過(guò)修改詞法分析程序、語(yǔ)法分析、程序編譯主體block和解釋執(zhí)行等各部分的修改擴(kuò)充,完成基本內(nèi)容和選做內(nèi)容。擴(kuò)充了賦值運(yùn)算+=、-=,運(yùn)算++、--,以及擴(kuò)充語(yǔ)句 repeat<語(yǔ)句序列>dowhile<條件&

5、gt;。</p><p><b>  操作平臺(tái)</b></p><p>  操作系統(tǒng)Windows XP SP3,硬件:AMD athlon 3600+ 1.9GHZ,1G內(nèi)存</p><p>  軟件:Visual C++6.0創(chuàng)天中文版</p><p><b>  主要成分的描述</b><

6、/p><p><b>  符號(hào)表</b></p><p>  根據(jù)符號(hào)變量的存儲(chǔ)類別定義及他們除向的位置和次序來(lái)確定每一個(gè)變量應(yīng)分配的存儲(chǔ)區(qū)及在該區(qū)的具體位置。編譯程序有兩類的存儲(chǔ)區(qū),即靜態(tài)的存儲(chǔ)區(qū)和動(dòng)態(tài)的存儲(chǔ)區(qū)。由于本課程設(shè)計(jì)沒(méi)有添加其他的數(shù)據(jù)類型暫時(shí)不需要在符號(hào)表里面處理。</p><p>  運(yùn)行時(shí)存儲(chǔ)組織和管理</p><

7、;p>  采用棧式存儲(chǔ)分配,運(yùn)行時(shí)每進(jìn)入一個(gè)過(guò)程,就在棧頂為該過(guò)程分配所需的數(shù)據(jù)空間,當(dāng)一個(gè)過(guò)程工作完畢返回時(shí),它在棧頂?shù)臄?shù)據(jù)空間也即釋放程序運(yùn)行時(shí)的存儲(chǔ)空間,棧中在某一個(gè)時(shí)刻可能會(huì)包含某個(gè)過(guò)程的幾個(gè)活動(dòng)記錄,即某個(gè)過(guò)程遞歸調(diào)用的情況,另外同樣一個(gè)存儲(chǔ)的位置,可能會(huì)不同運(yùn)行時(shí)刻分配給不同的數(shù)據(jù)對(duì)象。</p><p><b>  詞法分析的過(guò)程</b></p><p&

8、gt;  PL0的詞法分析程序GETSYM是一個(gè)獨(dú)立的過(guò)程,其功能是為語(yǔ)法語(yǔ)義分析提供單詞,把輸入的字符串形式的源程序分割成一個(gè)個(gè)單詞符號(hào)傳遞給語(yǔ)法語(yǔ)義分析為此PL0設(shè)置了3個(gè)全程變量</p><p>  SYM 存放每個(gè)單詞的類別,用內(nèi)部編碼表示</p><p>  ID 存放用戶所定義的標(biāo)識(shí)符的值。</p><p>  NUM 存放用戶定義的數(shù)</p>

9、;<p><b>  語(yǔ)法分析方法</b></p><p>  在PL/0中是采用遞歸子程序法進(jìn)行語(yǔ)法分析的,具體實(shí)現(xiàn)方法是為每個(gè)非終結(jié)符寫一個(gè)函數(shù),如遇到變量聲明時(shí)調(diào)用變量聲明函數(shù),遇到常量聲明時(shí)調(diào)用常量聲明函數(shù)等。</p><p><b>  中間代碼表示</b></p><p>  編譯程序所使用的中間

10、代碼有多種形式。常見(jiàn)的有逆波蘭式,三元式,四元式和樹(shù)形表示。</p><p><b>  目標(biāo)代碼</b></p><p>  PL0編譯程序所產(chǎn)生的目標(biāo)代碼是一個(gè)假想的棧式計(jì)算機(jī)匯編語(yǔ)言,可稱為類PCODE指令代碼,它不依賴于任何的實(shí)際計(jì)算機(jī)指令的格式如下:</p><p>  其中f代表功能碼,l代表層次差,也就是引用變量或過(guò)程的分程序與說(shuō)

11、明該變量或過(guò)程的分程序之間的層次差。a的含義對(duì)不同的指令有所區(qū)別。這里我們需要用到的有關(guān)目標(biāo)指令有:LIT LOD STO CAL INT JMP JPC OPR</p><p><b>  詳細(xì)設(shè)計(jì)</b></p><p><b>  擴(kuò)充賦值運(yùn)算</b></p><p> ?、偈紫仍陬^文件的enum sy

12、mbol中添加自己定義的+=,-=運(yùn)算的關(guān)鍵字peq和meq。還有#defiine symnum以便詞法分析時(shí)能夠正確的識(shí)別這些關(guān)鍵字。</p><p>  ②在詞法分析程序中添加對(duì)+=和-=的識(shí)別,也就是在程序中找到getsym函數(shù),添加如下:</p><p>  else if(ch=='+')</p><p><b>  {</

13、b></p><p><b>  getchdo;</b></p><p>  if(ch=='=')</p><p><b>  { </b></p><p>  sym=peq;這里是自己的定義的+=的標(biāo)識(shí)符</p><p><b>  g

14、etchdo;</b></p><p><b>  }</b></p><p>  else if(ch=='+')</p><p><b>  {</b></p><p><b>  sym=ppl;</b></p><p>

15、;<b>  getchdo;</b></p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p><b>  sym=plus;</b></p&

16、gt;<p><b>  }</b></p><p><b>  }</b></p><p>  同理對(duì)于-=的標(biāo)識(shí)符:</p><p>  else if(ch=='-')</p><p><b>  {</b></p><p

17、><b>  getchdo;</b></p><p>  if(ch=='=')</p><p><b>  { </b></p><p>  sym=meq;這里是自己的定義的+=的標(biāo)識(shí)符</p><p><b>  getchdo;</b></

18、p><p><b>  }</b></p><p>  else if(ch=='-')</p><p><b>  {</b></p><p><b>  sym=mmi;</b></p><p><b>  getchdo;&l

19、t;/b></p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  sym=minus;</p><p><b>  }</b><

20、/p><p><b>  }</b></p><p>  ③接著在語(yǔ)句處理函數(shù)statement添加如下的代碼:</p><p>  if(sym==becomes||sym==peq||sym==meq)</p><p><b>  {</b></p><p>  peqop=

21、sym;這是自己定義的標(biāo)識(shí)符,識(shí)別運(yùn)算符</p><p><b>  getsymdo;</b></p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p

22、>  error(13);</p><p><b>  }</b></p><p>  memcpy(nxtlev,fsys,sizeof(bool)* symnum);</p><p>  expressiondo(nxtlev,ptx,lev);</p><p>  if(i!=0&&peqop

23、==becomes)//賦值</p><p><b>  {</b></p><p>  gendo(sto,lev-table[i].level,table[i].adr);//將棧頂?shù)膬?nèi)容送入變量中</p><p><b>  }</b></p><p>  if(i!=0&&p

24、eqop==peq)//+=運(yùn)算</p><p><b>  {</b></p><p>  gendo(lod,lev-table[i].level,table[i].adr);//將變量放到棧頂</p><p>  gendo(opr,0,2); //加法運(yùn)算</p>&

25、lt;p>  endo(sto,lev-table[i].level,table[i].adr);//將棧頂?shù)膬?nèi)容送入變量中</p><p><b>  }</b></p><p>  if(i!=0&&peqop==meq)//-=運(yùn)算</p><p><b>  {</b></p>

26、<p>  gendo(lod,lev-table[i].level,table[i].adr);//將變量放到棧頂</p><p>  gendo(opr,0,3);</p><p>  gendo(opr,0,1); //減法運(yùn)算</p><p>  gendo(sto,lev-tabl

27、e[i].level,table[i].adr);//將棧頂?shù)膬?nèi)容送入變量中</p><p><b>  }</b></p><p>  2、擴(kuò)充語(yǔ)句repeat dowhile</p><p> ?、偈紫仍陬^文件中的enum symbol中添加repeatsym 和dowhilesym之后同樣在#define symnum名字表的類型數(shù)相應(yīng)的

28、增加,還有在#define norw變化相應(yīng)的數(shù)字。以便在詞法分析時(shí)能夠識(shí)別。</p><p>  ②來(lái)到初始化函數(shù)void init()中新增設(shè)置保留字,按照字母順序,便于折半查找:</p><p>  strcpy(&(word[4][0]),"dowhile");</p><p>  strcpy(&(word[4][0])

29、,"repeat");</p><p>  接下來(lái)在設(shè)置保留字符號(hào):</p><p>  wsym[4]=dowhilesym;</p><p>  wsym[4]=repeatsym;</p><p>  ③接下來(lái)到語(yǔ)句處理函數(shù)statement中添加如下的代碼:</p><p><b>

30、;  else</b></p><p><b>  {</b></p><p>  if(sym==repeatsym)/*準(zhǔn)備按照repeat語(yǔ)句處理*/</p><p><b>  {</b></p><p>  cx1=cx; /*保存判斷條件超作的位置*/</

31、p><p><b>  getsymdo;</b></p><p>  memcpy(nxtlev,fsys,sizeof(bool)*symnum);</p><p>  nxtlev[dowhilesym]=true;/*后跟符號(hào)為do*/</p><p>  statementdo(fsys,ptx,lev); /*循

32、環(huán)體*/</p><p>  /cx2=cx; /*保存循環(huán)體的結(jié)束的下一個(gè)位置*/</p><p>  //gendo(jmp,0,cx1);/*回頭重新判斷條件*/</p><p>  if(sym==dowhilesym)</p><p><b>  {</b></p><p>

33、<b>  getsymdo;</b></p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  error(34); /*缺少dowhile*/</p

34、><p><b>  }</b></p><p>  conditiondo(nxtlev,ptx,lev); /*調(diào)用條件處理*/</p><p>  cx2=cx; /*保存循環(huán)體的結(jié)束的下一個(gè)位置*/</p><p>  gendo(jpc,0,0);/*生成條件跳轉(zhuǎn),但跳出循環(huán)的地址未知*/</p

35、><p>  gendo(jmp,0,cx1);/*回頭重新判斷條件*/</p><p>  code[cx2].a=cx; /*反填跳出循環(huán)的地址,與if類似*/</p><p><b>  }</b></p><p>  3、增加運(yùn)算++和--</p><p> ?、偈紫葋?lái)到頭文件中找到enu

36、m symbol添加自己定義的++,--運(yùn)算符關(guān)鍵字ppl和mmi。有#defiine symnum以便詞法分析時(shí)能夠正確的識(shí)別這些關(guān)鍵字。</p><p> ?、谶@里跟前面不一樣的地方就是還要添加:</p><p>  facbegsys[ppl]=true;</p><p>  facbegsys[mmi]=true;</p><p> 

37、 這是一個(gè)關(guān)鍵的地方,因?yàn)槿绻?+或—當(dāng)作表達(dá)式的開(kāi)始符號(hào)時(shí)候,首先能夠正常的標(biāo)識(shí)符一樣。</p><p> ?、墼谠~法分析程序中添加對(duì)+=和-=的識(shí)別,也就是在程序中找到getsym函數(shù),添加如下:</p><p>  else if(ch=='+')</p><p><b>  {</b></p><p

38、><b>  getchdo;</b></p><p>  if(ch=='=')</p><p><b>  { </b></p><p>  sym=peq;這里是自己的定義的+=的標(biāo)識(shí)符</p><p><b>  getchdo;</b></

39、p><p><b>  }</b></p><p>  else if(ch=='+')</p><p><b>  {</b></p><p>  sym=ppl; 這里是自己的定義的+=的標(biāo)識(shí)符</p><p><b>  getchdo;</

40、b></p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p><b>  sym=plus;</b></p><p><b>  

41、}</b></p><p><b>  }</b></p><p>  同理對(duì)于-=的標(biāo)識(shí)符:</p><p>  else if(ch=='-')</p><p><b>  {</b></p><p><b>  getchdo;&l

42、t;/b></p><p>  if(ch=='=')</p><p><b>  { </b></p><p>  sym=meq;這里是自己的定義的+=的標(biāo)識(shí)符</p><p><b>  getchdo;</b></p><p><b>

43、  }</b></p><p>  else if(ch=='-')</p><p><b>  {</b></p><p>  sym=mmi; 這里是自己的定義的+=的標(biāo)識(shí)符</p><p><b>  getchdo;</b></p><p>

44、;<b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  sym=minus;</p><p><b>  }</b></p><p><b>  

45、}</b></p><p> ?、芨鶕?jù)前面語(yǔ)法描述,可以看出我這里是把i++或i—作為語(yǔ)句或因子來(lái)進(jìn)行處理的,這就得在相應(yīng)地方添加語(yǔ)句處理功能。</p><p>  作為語(yǔ)句處理時(shí),在statement中添加代碼如下:</p><p>  情況一:如a++,a—運(yùn)算符在后面:</p><p>  if(sym==ident)這里是

46、以變量開(kāi)始</p><p><b>  {</b></p><p>  i=position(id,*ptx);變量在符號(hào)表的位置</p><p><b>  if(i==0)</b></p><p><b>  {</b></p><p>  erro

47、r(11);出錯(cuò)處理</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  if(table[i].kind!=variable)只有對(duì)變量才可以做自增自減運(yùn)算</p>&

48、lt;p><b>  {</b></p><p>  error(12);</p><p><b>  i=0;</b></p><p><b>  }</b></p><p><b>  else</b></p><p>&

49、lt;b>  {</b></p><p><b>  getsymdo;</b></p><p>  if(sym==ppl)++運(yùn)算</p><p><b>  { </b></p><p>  gendo(lod,lev-table[i].level,table[i].ad

50、r);把變量放入棧頂</p><p>  gendo(lit,0,1);將常量1取到運(yùn)行棧頂</p><p>  gendo(opr,0,2);將棧頂和次棧頂?shù)膬?nèi)容作算術(shù)加運(yùn)算結(jié)果存放在次棧頂</p><p>  gendo(sto,lev-table[i].level,table[i].adr);將棧頂?shù)膬?nèi)容送入變量中</p><p>&l

51、t;b>  getsymdo;</b></p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  if(sym==mmi)—運(yùn)算</p><p>&

52、lt;b>  { </b></p><p>  gendo(lod,lev-table[i].level,table[i].adr); 把變量放入棧頂</p><p>  gendo(lit,0,1); 將常量1取到運(yùn)行棧頂</p><p>  gendo(opr,0,3); 將棧頂和次棧頂?shù)膬?nèi)容作算術(shù)減運(yùn)算結(jié)果存放在次棧頂</p>

53、<p>  gendo(sto,lev-table[i].level,table[i].adr); 將棧頂?shù)膬?nèi)容送入變量中</p><p><b>  getsymdo;</b></p><p><b>  }</b></p><p>  情況二:如++a,—a運(yùn)算符在前面:</p><p&

54、gt;  if(sym==ppl)</p><p><b>  { </b></p><p>  i=position(id,*ptx);</p><p><b>  if(i==0)</b></p><p><b>  {</b></p><p>

55、  error(11);</p><p>  }//參考書上面的例子,即I為標(biāo)識(shí)符在符號(hào)表的位置</p><p><b>  else{</b></p><p><b>  getsymdo;</b></p><p>  gendo(lod,lev-table[i].level,table[i]

56、.adr);把變量放入棧頂</p><p>  gendo(lit,0,1);將常量1取到運(yùn)行棧頂</p><p>  gendo(opr,0,2);將棧頂和次棧頂?shù)膬?nèi)容作算術(shù)加運(yùn)算結(jié)果存放在次棧頂</p><p>  gendo(sto,lev-table[i].level,table[i].adr);將棧頂?shù)膬?nèi)容送入變量中</p><p>

57、;<b>  getsymdo;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  if(sym==mmi)</p><p><b>  { </b></p><p>  

58、i=position(id,*ptx);</p><p><b>  if(i==0)</b></p><p><b>  {</b></p><p>  error(11);</p><p><b>  }//同理,</b></p><p><b

59、>  else</b></p><p><b>  {</b></p><p><b>  getsymdo;</b></p><p>  gendo(lod,lev-table[i].level,table[i].adr); 把變量放入棧頂</p><p>  gendo(lit

60、,0,1); 將常量1取到運(yùn)行棧頂</p><p>  gendo(opr,0,3); 將棧頂和次棧頂?shù)膬?nèi)容作算術(shù)減運(yùn)算結(jié)果存放在次棧頂</p><p>  gendo(sto,lev-table[i].level,table[i].adr); 將棧頂?shù)膬?nèi)容送入變量中</p><p><b>  getsymdo;</b></p>

61、<p><b>  }</b></p><p><b>  }</b></p><p>  作為因子處理時(shí),在factor中添加代碼如下:</p><p>  情況一:如a++,a—運(yùn)算符在后面:</p><p>  作為因子處理時(shí),得在因子處理函數(shù)factor中當(dāng)檢測(cè)到當(dāng)前單詞是標(biāo)識(shí)符

62、時(shí),通過(guò)查找名字表確定類型,然后再通過(guò)switch進(jìn)行選擇操作,在switch中添加代碼如下:</p><p>  switch(table[i].kind)</p><p><b>  {</b></p><p>  case constant: /*名字為常量*/</p><p>  gendo(lit,0,tab

63、le[i].val); </p><p>  getsymdo; /*直接把常量的值入棧*/</p><p><b>  break;</b></p><p>  case variable: /*名字為變

64、量*/</p><p>  gendo(lod,lev-table[i].level,table[i].adr); /*找到變量地址并將其值入棧*/</p><p><b>  getsymdo;</b></p><p>  if(sym==ppl)++運(yùn)算</p><p><b>  { </

65、b></p><p>  gendo(lod,lev-table[i].level,table[i].adr);把變量放入棧頂</p><p>  gendo(lit,0,1);將常量1取到運(yùn)行棧頂</p><p>  gendo(opr,0,2);將棧頂和次棧頂?shù)膬?nèi)容作算術(shù)加運(yùn)算結(jié)果存放在次棧頂</p><p>  gendo(sto

66、,lev-table[i].level,table[i].adr);將棧頂?shù)膬?nèi)容送入變量中</p><p><b>  getsymdo;</b></p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {&l

67、t;/b></p><p>  if(sym==mmi)—運(yùn)算</p><p><b>  { </b></p><p>  gendo(lod,lev-table[i].level,table[i].adr); 把變量放入棧頂</p><p>  gendo(lit,0,1); 將常量1取到運(yùn)行棧頂</p

68、><p>  gendo(opr,0,3); 將棧頂和次棧頂?shù)膬?nèi)容作算術(shù)減運(yùn)算結(jié)果存放在次棧頂</p><p>  gendo(sto,lev-table[i].level,table[i].adr); 將棧頂?shù)膬?nèi)容送入變量中</p><p><b>  getsymdo;</b></p><p><b>  }&

69、lt;/b></p><p>  case procedur: </p><p>  getsymdo;/*名字為過(guò)程*/</p><p>  error(21); /*不能為過(guò)程*/</p><p><b>  break;</b></p><p><b>  }</

70、b></p><p>  情況二:如++a,—a運(yùn)算符在前面:</p><p>  if(sym==ppl)</p><p><b>  {</b></p><p>  getsymdo; </p><p>  if(sym==ident)</p><p><b

71、>  {</b></p><p>  i=position(id,*ptx);</p><p><b>  if(i==0)</b></p><p><b>  {</b></p><p>  error(11);</p><p>  }//參考書上面的例

72、子,即I為標(biāo)識(shí)符在符號(hào)表的位置</p><p>  else if(table[i].kind==variable) { </p><p>  gendo(lod,lev-table[i].level,table[i].adr);把變量放入棧頂</p><p>  gendo(lit,0,1);將常量1取到運(yùn)行棧頂</p

73、><p>  gendo(opr,0,2);將棧頂和次棧頂?shù)膬?nèi)容作算術(shù)加運(yùn)算結(jié)果存放在次棧頂</p><p>  gendo(sto,lev-table[i].level,table[i].adr);將棧頂?shù)膬?nèi)容送入變量中</p><p><b>  getsymdo;</b></p><p><b>  }<

74、;/b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  if(sym==mmi)<

75、;/p><p><b>  {</b></p><p><b>  getsymdo;</b></p><p>  if(sym==ident)</p><p><b>  {</b></p><p>  i=position(id,*ptx);</p

76、><p><b>  if(i==0)</b></p><p><b>  {</b></p><p>  error(11);</p><p>  }//參考書上面的例子,即I為標(biāo)識(shí)符在符號(hào)表的位置</p><p>  else if(table[i].kind==vari

77、able) </p><p><b>  {</b></p><p>  gendo(lod,lev-table[i].level,table[i].adr); 把變量放入棧頂</p><p>  gendo(lit,0,1); 將常量1取到運(yùn)行棧頂</p><p>  gendo(opr,0,3); 將棧頂和次棧頂?shù)膬?nèi)

78、容作算術(shù)減運(yùn)算結(jié)果存放在次棧頂</p><p>  gendo(sto,lev-table[i].level,table[i].adr); 將棧頂?shù)膬?nèi)容送入變量中</p><p><b>  getsymdo;</b></p><p><b>  }</b></p><p><b>  }

79、</b></p><p><b>  }</b></p><p><b>  五、測(cè)試用例</b></p><p>  測(cè)試時(shí),完成一個(gè)功能就先測(cè)試,保證后面的程序不會(huì)因前面的不通過(guò)而影響到后面的。由于把全部的例子寫在一個(gè)PL0文件中,提示程序太長(zhǎng)所以就寫了兩個(gè)例子,這里就只測(cè)試+=,-=賦值運(yùn)算,++,--運(yùn)

80、算以及repeat dowhile語(yǔ)句:</p><p>  六、開(kāi)發(fā)過(guò)程和完成情況</p><p><b>  開(kāi)發(fā)過(guò)程:</b></p><p>  這次編譯原理課程設(shè)計(jì)是在昨晚實(shí)驗(yàn)的基礎(chǔ)上完成的總體來(lái)說(shuō)難度不是很。之前在做實(shí)驗(yàn)時(shí)已對(duì)基本的關(guān)鍵字進(jìn)行了添加,這次課程設(shè)計(jì)主要是對(duì)一些功能進(jìn)行擴(kuò)充和修改。在做+=和-=運(yùn)算時(shí)關(guān)鍵是理解變量在符號(hào)

81、表的位置,以及如何進(jìn)行把變量放到棧頂和把棧頂?shù)膬?nèi)容送入變量單元中。在gendo功能上似乎遇到了問(wèn)題,即3個(gè)參數(shù)的功能碼,層差和位移量。關(guān)鍵在理解后面兩個(gè)參數(shù)lev-table[i].level和table[i].adr.還有 i=position(id,*ptx)中i的功能。需要 說(shuō)明的是在做-=運(yùn)算時(shí)結(jié)果總是為負(fù)數(shù),經(jīng)過(guò)慢慢思考其運(yùn)算的過(guò)程,最終也解決了。其實(shí)在這一步一步的過(guò)程就逐漸理解PL0的過(guò)程。到了repeat dowhile

82、的過(guò)程,參照了原來(lái)程序就帶有的功能。即while do,難度也不是很大!在做++,--運(yùn)算時(shí),開(kāi)始時(shí)候在statement函數(shù)添加了處理語(yǔ)句。對(duì)于a++能編譯通過(guò),而++a就不行,后面在網(wǎng)上參考了例子,原來(lái)還有一種情況就是++當(dāng)作因子處理的情況。前面只是當(dāng)作語(yǔ)句處理。之后就能處理形如b:=++a的語(yǔ)句。解決了這些問(wèn)題后,后面打算添加如for to do的語(yǔ)句,但是在</p><p><b>  完成情況

83、</b></p><p>  完成內(nèi)容:擴(kuò)充賦值運(yùn)算+=,-=和repeat <語(yǔ)句序列>dowhile<條件>,</p><p>  以及自增++自減—運(yùn)算。For <條件>to<條件> do<語(yǔ)句序列>最后因?yàn)槎啻握{(diào)試沒(méi)有通過(guò),也就沒(méi)有完成這一功能。</p><p><b>  七

溫馨提示

  • 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)論