

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、<p><b> 課 程 設 計</b></p><p> 課程名稱____編譯原理______</p><p> 題目名稱____編譯課程設計__</p><p> 學生學院____計算機學院____</p><p> 專業(yè)班級___ _ </p><p&
2、gt; 學 號__ __</p><p> 2011 年 1 月 8 日</p><p><b> 一、實驗目的</b></p><p> 在分析理解一個教學型編譯程序(如PL/0)的基礎上,對其詞法分析程序、語法分析程序和語義處理程序進行部分修改擴充。達到進一步了解程序編譯過程的基本原理和基本實現
3、方法的目的。</p><p><b> 二、課程設計要求</b></p><p> 基本內容(成績范圍:“中”、“及格”或“不及格”)</p><p> (1)擴充賦值運算:+= 和 -=</p><p> ?。?)擴充語句(Pascal的FOR語句):</p><p> ?、貴OR <
4、;變量>:=<表達式> TO <表達式> DO <語句></p><p> ②FOR <變量>:=<表達式> DOWNTO <表達式> DO <語句></p><p> 其中,語句①的循環(huán)變量的步長為2,</p><p> 語句②的循環(huán)變量的步長為-2。</p>
5、;<p> 選做內容(成績評定范圍擴大到:“優(yōu)”和“良”)</p><p> (1)增加運算:++ 和 --。</p><p> (2)增加類型:① 字符類型; ② 實數類型。</p><p> ?。?)擴充函數:① 有返回值和返回語句;② 有參數函數。</p><p> (4)增加一維數組類型(可增加
6、指令)。</p><p> ?。?)其他典型語言設施。</p><p><b> 三、實驗環(huán)境與工具</b></p><p> ?。?)計算機及操作系統(tǒng):PC機,Windows2000,WindowsXP</p><p> ?。?)程序設計語言:C++Builder5,VC 6.0</p><p&g
7、t; ?。?)教學型編譯程序:PL/0 </p><p><b> 設計原理與方案</b></p><p> 1.PL0語言結構圖如下</p><p><b> 2.各功能模塊描述</b></p><p> 模塊名:主函數模塊(即:void __fastcall TForm1::Button
8、RunClick(TObject *Sender)) 輸 入:PL/0源程序 輸 出:目標程序和運行結果 功 能:主程序初始化編譯環(huán)境,建立關鍵字表,調用分程序Block對源文件進行編譯,當源程序編譯正確時,自動調用解釋執(zhí)行程序,對目標代碼進行解釋執(zhí)行。 </p><p> 模塊名:Error(即:void Error(int n)) 輸 入:出錯位置CC和錯誤性質編號N輸 出:顯示出錯信息 功
9、能:出錯處理,打印出錯位置和錯誤性質編號。 </p><p> 模塊名:GetSym(即:void GetSym()) 輸 入:源程序的字符流 輸 出:單詞符號 功 能:詞法分析,讀取一個單詞 </p><p> 模塊名:Gen(即:void GEN(FCT X, int Y, int Z)) 輸 入:偽操作碼F;層次差L;立即數或位移量或功能號A輸 出:類PCODE指令
10、功 能:生成目標代碼,并送入目標程序區(qū)。 </p><p> 模塊名:Test(即:void TEST(SYMSET S1, SYMSET S2, int N)) 輸 入:進入或退出某一語法單元時當前單詞應屬合法的集合S1;在某一出錯狀態(tài)時,可恢復分析工作的補充單詞符號集合S2;出錯信息編號 輸 出:調用Error顯示出錯信息 功 能:測試當前單詞是否是合法 </p><p>
11、; 模塊名:Block(即:void Block(int LEV, int TX, SYMSET FSYS)) 輸 入:分程序層次LEV;符號表索引TX;退出時當前符號應屬的集合FSYS; 輸 出:生成分程序的目標代碼 功 能:分程序分析處理過程。 </p><p> 模塊名:Enter(即:void ENTER(OBJECTS K, int LEV, int &TX, int &DX
12、)) 輸 入:單詞類別K;層次L;符號表索引TX;地址指針DX; 輸 出:更新的符號表 功 能:登錄過程說明對象包括變量、常量和過程名的屬性信息到符號表。 </p><p> 模塊名:Position(即:int POSITION(ALFA ID, int TX)) 輸 入:標識符ID;符號表索引TX輸 出:標識符在符號表中的位置 功 能:查找標識符在符號表中的位置。 </p>&
13、lt;p> 模塊名:Constdeclaration(即:void ConstDeclaration(int LEV,int &TX,int &DX)) 輸 入:層次L;符號表索引TX;地址指針DX; 輸 出:更新的符號表 功 能:常量定義處理,收集常量信息并登錄到符號表。 </p><p> 模塊名:Vardeclaration(即:void VarDeclaration(in
14、t LEV,int &TX,int &DX)) 輸 入:層次L;符號表索引TX;地址指針DX; 輸 出:更新的符號表 功 能:變量定義處理,收集變量信息并登錄到符號表。 </p><p> 模塊名:Listcode(即:void ListCode(int CX0)) 輸 入:當前分程序在目標代碼區(qū)的起始索引CX輸 出:打印當前分程序的目標代碼 功 能:列出目標代碼清單。 </
15、p><p> 模塊名:Factor(即:void FACTOR(SYMSET FSYS, int LEV, int &TX)) 輸 入:分程序層次LEV;符號表索引TX;退出時當前符號應屬的集合FSYS; 輸 出:<因子>編譯結果與<因子>類型Ftype; 功 能:因子分析處理。</p><p> 模塊名:Term(即:void TERM(SYMSET
16、 FSYS, int LEV, int &TX)) 輸 入:分程序層次LEV;符號表索引TX;退出時當前符號應屬的集合FSYS; 輸 出:<項>編譯結果與<項>類型Ttype; 功 能:項分析處理過程。 </p><p> 模塊名:Expression(即:void EXPRESSION(SYMSET FSYS, int LEV, int &TX)) 輸 入:分
17、程序層次LEV;符號表索引TX;退出時當前符號應屬的集合FSYS; 輸 出:表達式編譯結果與表達式類型Etype; 功 能:表達式分析處理。 </p><p> 模塊名:Condition(即:void CONDITION(SYMSET FSYS,int LEV,int &TX)) 輸 入:分程序層次LEV;符號表索引TX;退出時當前符號應屬的集合FSYS; 輸 出:<條件>編譯結
18、果與<條件>類型Ftype; 功 能:條件處理。</p><p> 模塊名:Statement(即:void STATEMENT(SYMSET FSYS,int LEV,int &TX)) 輸 入:分程序層次LEV;符號表索引TX;退出時當前符號應屬的集合FSYS; 輸 出:相應語句編譯結果; 功 能:語法分析,語句部分處理。</p><p> 模塊名:Bl
19、ock(即void Block(int LEV, int TX, SYMSET FSYS))</p><p> Lev:當前分程序所在層</p><p> Tx:名字表當前尾指針</p><p> Fsys:當前模塊后跟符號集合 </p><p> 模塊名:Base(即:int BASE(int L,int B,int S[]))
20、輸 入:層差L;基地址B;運行數據區(qū)S; 輸 出:與當前數據區(qū)相差為L的數據區(qū)的首地址; 功 能:通過靜態(tài)鏈求數據區(qū)首地址。</p><p> 模塊名:Interpret(即:void Interpret()) 輸 入:目標代碼; 輸 出:用戶程序執(zhí)行結果; 功 能:對目標代碼進行解析執(zhí)行。</p><p> 程序修改部分如下:修改部分用黑斜體表明顯示</p>
21、<p> ( 1 ).擴充賦值運算:+= ,++,--,-=</p><p> 1).增加保留字以及運算符的類別表示</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、個數: 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語言能夠識別新增的運算符。畫出擴充條件語句的語法描述圖如下(詞法分析)</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)函數中作出以下修改(語法分析)</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) //實現+=功能</p><p> { GetSym();</p><p> EXPRESSION(FSYS,LEV,TX);表達式分析</p><p> GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);生成目標代碼</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) //實現++功能</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) //實現-=功能</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、//實現――功能</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> 至此賦值運算--,++,+=,-=的操作擴展完成。</p>
48、<p><b> 測試結果分析</b></p><p> ( 1 )實現++功能測試</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 )實現--功能測試</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 )實現+=功能測試</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 )實現-=功能測試</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> 基本內容(必做)沒有完成擴充for語句。選做內容完成了++,--。</p><p><b> 心得體會</b></p><p> 這是一次在
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 編譯原理課程設計
- 編譯原理課程設計
- 編譯原理課程設計--編譯器
- 編譯原理課程設計報告_編譯器
- 編譯原理課程設計 (2)
- 編譯原理課程設計報告
- 編譯原理課程設計報告
- 編譯原理課程設計--- 編譯代碼生成器設計
- 編譯原理課程設計報告--編譯器實現
- 編譯原理課程設計---編譯器的實現
- 編譯原理課程設計報告-編譯程序構造
- 編譯技術課程設計文檔
- 編譯原理課程設計詞法分析
- 編譯原理課程設計報告 (2)
- 編譯原理課程設計--詞法分析
- 編譯原理課程設計--c語言編譯器實現
- 編譯原理課程設計--c語言編譯器實現
- c語言編譯器實現-編譯原理課程設計
- 編譯原理課程設計---簡單編譯器的設計與實現
- 編譯原理課程設計--- 詞法分析程序
評論
0/150
提交評論