編譯課程設(shè)計(jì)_第1頁
已閱讀1頁,還剩10頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(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>  題目名稱____編譯課程設(shè)計(jì)__</p><p>  學(xué)生學(xué)院____計(jì)算機(jī)學(xué)院____</p><p>  專業(yè)班級(jí)___ _ </p><p&

2、gt;  學(xué) 號(hào)__ __</p><p>  2011 年 1 月 8 日</p><p><b>  一、實(shí)驗(yàn)?zāi)康?lt;/b></p><p>  在分析理解一個(gè)教學(xué)型編譯程序(如PL/0)的基礎(chǔ)上,對(duì)其詞法分析程序、語法分析程序和語義處理程序進(jìn)行部分修改擴(kuò)充。達(dá)到進(jìn)一步了解程序編譯過程的基本原理和基本實(shí)現(xiàn)

3、方法的目的。</p><p><b>  二、課程設(shè)計(jì)要求</b></p><p>  基本內(nèi)容(成績(jī)范圍:“中”、“及格”或“不及格”)</p><p> ?。?)擴(kuò)充賦值運(yùn)算:+= 和 -=</p><p>  (2)擴(kuò)充語句(Pascal的FOR語句):</p><p> ?、貴OR <

4、;變量>:=<表達(dá)式> TO <表達(dá)式> DO <語句></p><p> ?、贔OR <變量>:=<表達(dá)式> DOWNTO <表達(dá)式> DO <語句></p><p>  其中,語句①的循環(huán)變量的步長(zhǎng)為2,</p><p>  語句②的循環(huán)變量的步長(zhǎng)為-2。</p>

5、;<p>  選做內(nèi)容(成績(jī)?cè)u(píng)定范圍擴(kuò)大到:“優(yōu)”和“良”)</p><p> ?。?)增加運(yùn)算:++ 和 --。</p><p>  (2)增加類型:① 字符類型; ② 實(shí)數(shù)類型。</p><p> ?。?)擴(kuò)充函數(shù):① 有返回值和返回語句;② 有參數(shù)函數(shù)。</p><p> ?。?)增加一維數(shù)組類型(可增加

6、指令)。</p><p> ?。?)其他典型語言設(shè)施。</p><p><b>  三、實(shí)驗(yàn)環(huán)境與工具</b></p><p> ?。?)計(jì)算機(jī)及操作系統(tǒng):PC機(jī),Windows2000,WindowsXP</p><p> ?。?)程序設(shè)計(jì)語言:C++Builder5,VC 6.0</p><p&g

7、t; ?。?)教學(xué)型編譯程序:PL/0 </p><p><b>  設(shè)計(jì)原理與方案</b></p><p>  1.PL0語言結(jié)構(gòu)圖如下</p><p><b>  2.各功能模塊描述</b></p><p>  模塊名:主函數(shù)模塊(即:void __fastcall TForm1::Button

8、RunClick(TObject *Sender)) 輸 入:PL/0源程序 輸 出:目標(biāo)程序和運(yùn)行結(jié)果 功 能:主程序初始化編譯環(huán)境,建立關(guān)鍵字表,調(diào)用分程序Block對(duì)源文件進(jìn)行編譯,當(dāng)源程序編譯正確時(shí),自動(dòng)調(diào)用解釋執(zhí)行程序,對(duì)目標(biāo)代碼進(jìn)行解釋執(zhí)行。 </p><p>  模塊名:Error(即:void Error(int n)) 輸 入:出錯(cuò)位置CC和錯(cuò)誤性質(zhì)編號(hào)N輸 出:顯示出錯(cuò)信息 功

9、能:出錯(cuò)處理,打印出錯(cuò)位置和錯(cuò)誤性質(zhì)編號(hào)。 </p><p>  模塊名:GetSym(即:void GetSym()) 輸 入:源程序的字符流 輸 出:?jiǎn)卧~符號(hào) 功 能:詞法分析,讀取一個(gè)單詞 </p><p>  模塊名:Gen(即:void GEN(FCT X, int Y, int Z)) 輸 入:偽操作碼F;層次差L;立即數(shù)或位移量或功能號(hào)A輸 出:類PCODE指令

10、功 能:生成目標(biāo)代碼,并送入目標(biāo)程序區(qū)。 </p><p>  模塊名:Test(即:void TEST(SYMSET S1, SYMSET S2, int N)) 輸 入:進(jìn)入或退出某一語法單元時(shí)當(dāng)前單詞應(yīng)屬合法的集合S1;在某一出錯(cuò)狀態(tài)時(shí),可恢復(fù)分析工作的補(bǔ)充單詞符號(hào)集合S2;出錯(cuò)信息編號(hào) 輸 出:調(diào)用Error顯示出錯(cuò)信息 功 能:測(cè)試當(dāng)前單詞是否是合法 </p><p>

11、;  模塊名:Block(即:void Block(int LEV, int TX, SYMSET FSYS)) 輸 入:分程序?qū)哟蜭EV;符號(hào)表索引TX;退出時(shí)當(dāng)前符號(hào)應(yīng)屬的集合FSYS; 輸 出:生成分程序的目標(biāo)代碼 功 能:分程序分析處理過程。 </p><p>  模塊名:Enter(即:void ENTER(OBJECTS K, int LEV, int &TX, int &DX

12、)) 輸 入:?jiǎn)卧~類別K;層次L;符號(hào)表索引TX;地址指針DX; 輸 出:更新的符號(hào)表 功 能:登錄過程說明對(duì)象包括變量、常量和過程名的屬性信息到符號(hào)表。 </p><p>  模塊名:Position(即:int POSITION(ALFA ID, int TX)) 輸 入:標(biāo)識(shí)符ID;符號(hào)表索引TX輸 出:標(biāo)識(shí)符在符號(hào)表中的位置 功 能:查找標(biāo)識(shí)符在符號(hào)表中的位置。 </p>&

13、lt;p>  模塊名:Constdeclaration(即:void ConstDeclaration(int LEV,int &TX,int &DX)) 輸 入:層次L;符號(hào)表索引TX;地址指針DX; 輸 出:更新的符號(hào)表 功 能:常量定義處理,收集常量信息并登錄到符號(hào)表。 </p><p>  模塊名:Vardeclaration(即:void VarDeclaration(in

14、t LEV,int &TX,int &DX)) 輸 入:層次L;符號(hào)表索引TX;地址指針DX; 輸 出:更新的符號(hào)表 功 能:變量定義處理,收集變量信息并登錄到符號(hào)表。 </p><p>  模塊名:Listcode(即:void ListCode(int CX0)) 輸 入:當(dāng)前分程序在目標(biāo)代碼區(qū)的起始索引CX輸 出:打印當(dāng)前分程序的目標(biāo)代碼 功 能:列出目標(biāo)代碼清單。 </

15、p><p>  模塊名:Factor(即:void FACTOR(SYMSET FSYS, int LEV, int &TX)) 輸 入:分程序?qū)哟蜭EV;符號(hào)表索引TX;退出時(shí)當(dāng)前符號(hào)應(yīng)屬的集合FSYS; 輸 出:<因子>編譯結(jié)果與<因子>類型Ftype; 功 能:因子分析處理。</p><p>  模塊名:Term(即:void TERM(SYMSET

16、 FSYS, int LEV, int &TX)) 輸 入:分程序?qū)哟蜭EV;符號(hào)表索引TX;退出時(shí)當(dāng)前符號(hào)應(yīng)屬的集合FSYS; 輸 出:<項(xiàng)>編譯結(jié)果與<項(xiàng)>類型Ttype; 功 能:項(xiàng)分析處理過程。 </p><p>  模塊名:Expression(即:void EXPRESSION(SYMSET FSYS, int LEV, int &TX)) 輸 入:分

17、程序?qū)哟蜭EV;符號(hào)表索引TX;退出時(shí)當(dāng)前符號(hào)應(yīng)屬的集合FSYS; 輸 出:表達(dá)式編譯結(jié)果與表達(dá)式類型Etype; 功 能:表達(dá)式分析處理。 </p><p>  模塊名:Condition(即:void CONDITION(SYMSET FSYS,int LEV,int &TX)) 輸 入:分程序?qū)哟蜭EV;符號(hào)表索引TX;退出時(shí)當(dāng)前符號(hào)應(yīng)屬的集合FSYS; 輸 出:<條件>編譯結(jié)

18、果與<條件>類型Ftype; 功 能:條件處理。</p><p>  模塊名:Statement(即:void STATEMENT(SYMSET FSYS,int LEV,int &TX)) 輸 入:分程序?qū)哟蜭EV;符號(hào)表索引TX;退出時(shí)當(dāng)前符號(hào)應(yīng)屬的集合FSYS; 輸 出:相應(yīng)語句編譯結(jié)果; 功 能:語法分析,語句部分處理。</p><p>  模塊名:Bl

19、ock(即void Block(int LEV, int TX, SYMSET FSYS))</p><p>  Lev:當(dāng)前分程序所在層</p><p>  Tx:名字表當(dāng)前尾指針</p><p>  Fsys:當(dāng)前模塊后跟符號(hào)集合 </p><p>  模塊名:Base(即:int BASE(int L,int B,int S[]))

20、輸 入:層差L;基地址B;運(yùn)行數(shù)據(jù)區(qū)S; 輸 出:與當(dāng)前數(shù)據(jù)區(qū)相差為L(zhǎng)的數(shù)據(jù)區(qū)的首地址; 功 能:通過靜態(tài)鏈求數(shù)據(jù)區(qū)首地址。</p><p>  模塊名:Interpret(即:void Interpret()) 輸 入:目標(biāo)代碼; 輸 出:用戶程序執(zhí)行結(jié)果; 功 能:對(duì)目標(biāo)代碼進(jìn)行解析執(zhí)行。</p><p>  程序修改部分如下:修改部分用黑斜體表明顯示</p>

21、<p>  ( 1 ).擴(kuò)充賦值運(yùn)算:+= ,++,--,-=</p><p>  1).增加保留字以及運(yùn)算符的類別表示</p><p>  在枚舉類型 SYMBOL中添加元素PLUSEQ,MINEQ, ADDSEL,DECSEL,</p><p>  分別代表+=, -=, ++ , --。</p><p>  typedef

22、enum { NUL, IDENT, NUMBER, PLUS, MINUS, TIMES,</p><p>  SLASH, ODDSYM, EQL, NEQ, LSS, LEQ, GTR, GEQ,</p><p>  PLUSEQ,MINEQ, ADDSEL,DECSEL,</p><p>  LPAREN, RPAREN, COMMA, SEMICOLON

23、, PERIOD,</p><p>  BECOMES, BEGINSYM, ENDSYM, IFSYM, THENSYM,</p><p>  WHILESYM, WRITESYM, READSYM, DOSYM, CALLSYM,</p><p>  CONSTSYM, VARSYM, PROCSYM, PROGSYM,ELSESYM,</p>&

24、lt;p>  REPEATSYM, DOWHILESYM, RETURRNSYM } SYMBOL;</p><p>  char *SYMOUT[] = {"NUL", "IDENT", "NUMBER", "PLUS", "MINUS", "TIMES",</p><

25、;p>  "SLASH", "ODDSYM", "EQL", "NEQ", "LSS", "LEQ", "GTR", "GEQ",</p><p>  ""PLUSEQ","MINEQ", "

26、;ADDSEL","DECSEL",</p><p>  "LPAREN", "RPAREN", "COMMA", "SEMICOLON", "PERIOD",</p><p>  "BECOMES", "BEGINSYM"

27、;, "ENDSYM", "IFSYM", "THENSYM",</p><p>  "WHILESYM", "WRITESYM", "READSYM", "DOSYM", "CALLSYM",</p><p>  "CO

28、NSTSYM", "VARSYM", "PROCSYM", "PROGSYM","ELSESYM",</p><p>  "REPEATSYM", "DOWHILESYM", "RETURNSYM"};</p><p>  2).增加保留字的

29、個(gè)數(shù): const NORW = 22; </p><p>  3).改變所有的分配空間</p><p>  把原先的“33”全都改為“41”</p><p>  SYMSET SymSetUnion(SYMSET S1, SYMSET S2) {</p><p>  SYMSET S=(SYMSET)malloc(sizeof(int

30、)*41);</p><p>  for (int i=0; i<41; 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&g

31、t;  }</b></p><p>  4)修改GetSym( )以使PL/0語言能夠識(shí)別新增的運(yùn)算符。畫出擴(kuò)充條件語句的語法描述圖如下(詞法分析)</p><p>  if (CH=='<')</p><p>  { GetCh();</p><p>  if (CH=='=') { SYM

32、=LEQ; GetCh(); }</p><p><b>  else</b></p><p>  if (CH=='>') { SYM=NEQ; GetCh(); }</p><p>  else SYM=LSS;</p><p><b>  }</b></p>

33、<p>  else if (CH=='>') </p><p><b>  {GetCh();</b></p><p>  if (CH=='=') { SYM=GEQ; GetCh(); }</p><p>  else SYM=GTR;</p><p><b&

34、gt;  }</b></p><p>  else if(CH=='+')</p><p>  { GetCh();</p><p>  if(CH=='=') {SYM=PLUSEQ; GetCh(); }</p><p>  else if(CH=='+')</p&g

35、t;<p>  { GetCh();SYM=MINEQ; }</p><p>  else SYM=PLUS;</p><p><b>  }</b></p><p>  else if(CH=='-')</p><p>  { GetCh();</p><p&

36、gt;  if(CH=='=') { GetCh(); SYM=ADDSEL; }</p><p>  else if(CH=='-')</p><p>  { GetCh(); SYM=DECSEL; }</p><p>  else SYM=MINUS; </p><p

37、><b>  }</b></p><p>  else { SYM=SSYM[CH]; GetCh(); }</p><p>  } /*GetSym()*/</p><p>  5)在void STATEMENT(SYMSET FSYS,int LEV,int &TX)函數(shù)中作出以下修改(語法分析)</p><

38、;p>  int i,CX1,CX2;</p><p>  switch (SYM) {</p><p>  case IDENT:</p><p>  i=POSITION(ID,TX);</p><p>  if (i==0) Error(11);</p><p><b>  else if<

39、;/b></p><p>  (TABLE[i].KIND!=VARIABLE) { /*ASSIGNMENT TO NON-VARIABLE*/</p><p>  Error(12); i=0 ;}</p><p><b>  GetSym();</b></p><p>  if (SYM==BECOMES)&

40、lt;/p><p>  { GetSym();</p><p>  EXPRESSION(FSYS,LEV,TX);</p><p>  if (i!=0) GEN(STO,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);</p><p><b>  }</b></p><p

41、>  else if(SYM==PLUSEQ) //實(shí)現(xiàn)+=功能</p><p>  { GetSym();</p><p>  EXPRESSION(FSYS,LEV,TX);表達(dá)式分析</p><p>  GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);生成目標(biāo)代碼</p><p>

42、;  GEN(OPR,0,2);</p><p>  GEN(STO,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);</p><p><b>  }</b></p><p>  else if(SYM==ADDSEL) //實(shí)現(xiàn)++功能</p><p>  { GetSym()

43、;</p><p>  GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);</p><p>  EXPRESSION(FSYS,LEV,TX);</p><p>  GEN(OPR,0,3);</p><p>  GEN(STO,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.A

44、DR);</p><p><b>  }</b></p><p>  else if(SYM==MINEQ) //實(shí)現(xiàn)-=功能</p><p>  { GetSym();</p><p>  GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);</p>&

45、lt;p>  GEN(LIT,0,1);</p><p>  GEN(OPR,0,2);</p><p>  GEN(STO,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);</p><p><b>  }</b></p><p>  else if(SYM==DECSEL)

46、//實(shí)現(xiàn)――功能</p><p>  {GetSym();</p><p>  GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);</p><p>  GEN(LIT,0,1);</p><p>  GEN(OPR,0,3);</p><p>  GEN(STO,LEV-TA

47、BLE[i].vp.LEVEL,TABLE[i].vp.ADR);</p><p><b>  }</b></p><p>  else Error(13);</p><p><b>  break;</b></p><p>  至此賦值運(yùn)算--,++,+=,-=的操作擴(kuò)展完成。</p>

48、<p><b>  測(cè)試結(jié)果分析</b></p><p>  ( 1 )實(shí)現(xiàn)++功能測(cè)試</p><p>  ***** PL/0 Compiler Demo *****</p><p>  === COMPILE PL0 ===</p><p>  0 PROGRAM EX01; </p>

49、<p><b>  0 VAR A; </b></p><p><b>  1 BEGIN </b></p><p>  2 READ(A); </p><p><b>  4 A++; </b></p><p>  8 WRITE (A) </p&

50、gt;<p><b>  10 END. </b></p><p><b>  0 JMP 0 1</b></p><p><b>  1 INI 0 4</b></p><p>  2 OPR 0 16</p><p><b>  3 STO 0 3&

51、lt;/b></p><p><b>  4 LOD 0 3</b></p><p><b>  5 LIT 0 1</b></p><p><b>  6 OPR 0 2</b></p><p><b>  7 STO 0 3</b></p&

52、gt;<p><b>  8 LOD 0 3</b></p><p>  9 OPR 0 14</p><p>  10 OPR 0 15</p><p>  11 OPR 0 0</p><p>  ~~~ RUN PL0 ~~~</p><p><b>  ? 8<

53、;/b></p><p><b>  9</b></p><p>  ~~~ END PL0 ~~~</p><p>  ( 2 )實(shí)現(xiàn)--功能測(cè)試</p><p>  === COMPILE PL0 ===</p><p>  0 PROGRAM EX02; </p><

54、;p><b>  0 VAR A; </b></p><p><b>  1 BEGIN </b></p><p>  2 READ(A); </p><p><b>  4 A--; </b></p><p>  8 WRITE (A) </p>

55、<p><b>  10 END. </b></p><p><b>  0 JMP 0 1</b></p><p><b>  1 INI 0 4</b></p><p>  2 OPR 0 16</p><p><b>  3 STO 0 3<

56、/b></p><p><b>  4 LOD 0 3</b></p><p><b>  5 LIT 0 1</b></p><p><b>  6 OPR 0 3</b></p><p><b>  7 STO 0 3</b></p>

57、<p><b>  8 LOD 0 3</b></p><p>  9 OPR 0 14</p><p>  10 OPR 0 15</p><p>  11 OPR 0 0</p><p>  ~~~ RUN PL0 ~~~</p><p><b>  ? 8</b

58、></p><p><b>  7</b></p><p>  ~~~ END PL0 ~~~</p><p>  ( 3 )實(shí)現(xiàn)+=功能測(cè)試</p><p>  === COMPILE PL0 ===</p><p>  0 PROGRAM EX03; </p><p&

59、gt;<b>  0 VAR A; </b></p><p><b>  1 BEGIN </b></p><p>  2 READ(A); </p><p>  4 A+=5; </p><p>  8 WRITE (A) </p><p><b> 

60、 10 END. </b></p><p><b>  0 JMP 0 1</b></p><p><b>  1 INI 0 4</b></p><p>  2 OPR 0 16</p><p><b>  3 STO 0 3</b></p><

61、;p><b>  4 LIT 0 5</b></p><p><b>  5 LOD 0 3</b></p><p><b>  6 OPR 0 2</b></p><p><b>  7 STO 0 3</b></p><p><b> 

62、 8 LOD 0 3</b></p><p>  9 OPR 0 14</p><p>  10 OPR 0 15</p><p>  11 OPR 0 0</p><p>  ~~~ RUN PL0 ~~~</p><p><b>  ? 8</b></p><p

63、><b>  13</b></p><p>  ~~~ END PL0 ~~~</p><p>  ( 4 )實(shí)現(xiàn)-=功能測(cè)試</p><p>  === COMPILE PL0 ===</p><p>  0 PROGRAM EX04; </p><p><b>  0 VAR

64、A; </b></p><p><b>  1 BEGIN </b></p><p>  2 READ(A); </p><p>  4 A-=5; </p><p>  8 WRITE (A) </p><p><b>  10 END. </b>&

65、lt;/p><p><b>  0 JMP 0 1</b></p><p><b>  1 INI 0 4</b></p><p>  2 OPR 0 16</p><p><b>  3 STO 0 3</b></p><p><b>  4 L

66、OD 0 3</b></p><p><b>  5 LIT 0 5</b></p><p><b>  6 OPR 0 3</b></p><p><b>  7 STO 0 3</b></p><p><b>  8 LOD 0 3</b>

67、</p><p>  9 OPR 0 14</p><p>  10 OPR 0 15</p><p>  11 OPR 0 0</p><p>  ~~~ RUN PL0 ~~~</p><p><b>  ? 8</b></p><p><b>  3<

68、/b></p><p>  ~~~ END PL0 ~~~</p><p><b>  完成情況</b></p><p>  基本內(nèi)容(必做)沒有完成擴(kuò)充for語句。選做內(nèi)容完成了++,--。</p><p><b>  心得體會(huì)</b></p><p>  這是一次在

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論