版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p> 《編譯原理課程設(shè)計》</p><p><b> 實(shí)驗(yàn)報告</b></p><p> 課 題:編譯器功能的實(shí)現(xiàn)</p><p><b> 目 錄</b></p><p><b> 1 介紹1</b></p><p><
2、;b> 1.1 前言1</b></p><p><b> 2 編譯器2</b></p><p> 2.1 PL/X編譯器結(jié)構(gòu)概述2</p><p> 2.2 語法元素4</p><p><b> 2.3語法圖5</b></p><p>
3、 2.4判斷是否符合兩條限制規(guī)則13</p><p> 2.5 語法出錯表定義16</p><p><b> 3 虛擬機(jī)17</b></p><p> 3.1 虛擬機(jī)組織結(jié)構(gòu)17</p><p> 3.2 虛擬機(jī)指令格式18</p><p><b> 4 程序設(shè)計2
4、1</b></p><p> 4.1 全局變量、全局常量21</p><p> 4.2 函數(shù)接口28</p><p> 5.編譯器功能的實(shí)現(xiàn)37</p><p><b> 5.1 概述37</b></p><p> 5.2 實(shí)例一37</p><
5、p> 5.3 實(shí)例二41</p><p> 5.4 實(shí)例三43</p><p><b> 1 介紹</b></p><p><b> 1.1 前言</b></p><p> 根據(jù)課程設(shè)計要求制作PL/X語言的編譯器,完成詞法分析、語法分析、語義分析及代碼生成、出錯處理和解釋運(yùn)行程
6、序,并添加一定的擴(kuò)展,最終實(shí)現(xiàn)一個PL/X的編譯器。</p><p><b> 所完成擴(kuò)展點(diǎn)說明:</b></p><p><b> 1)支持三種注釋</b></p><p><b> a)單行注釋</b></p><p> b)/*---*/ 多行注釋</p&g
7、t;<p> c)(*---*) 多行注釋</p><p> 2)支持read語句,因此可從終端獲取輸入</p><p> 3)支持write語句,因此可從終端輸出</p><p><b> 4)支持for語句</b></p><p> 5)支持do…while語句</p><
8、p><b> 6) call過程</b></p><p><b> 7) 求余運(yùn)算%</b></p><p> 8) 整數(shù)的奇偶o(jì)dd</p><p><b> 9) 冪運(yùn)行**</b></p><p> 關(guān)于出錯處理:分為詞法分析錯誤、句法分析錯誤、運(yùn)行時錯誤
9、(如除數(shù)為0)</p><p> 允許變量名或函數(shù)名重復(fù),但訪問的時候以最后一次聲明的為有效</p><p><b> 2 編譯器</b></p><p> 2.1 PL/X編譯器結(jié)構(gòu)概述</p><p> 圖 1 PL/X編譯程序的結(jié)構(gòu)圖</p><p> 圖 2 PL/X的解釋執(zhí)行結(jié)
10、構(gòu)</p><p> 圖 3 PL/X編譯程序總體流程圖</p><p> 語法分析過程PROG是整個編譯過程的核心,是指開始由主程序調(diào)用GETSYM取一個單詞,再調(diào)用語法分析過程PROG, PROG由當(dāng)前單詞根據(jù)語法規(guī)則再調(diào)用其它過程,如說明處理、代碼生成或出錯處理等過程進(jìn)行分析,當(dāng)分析完一個單詞后,PROG再調(diào)用GETSYM取下一個單詞,一直重復(fù)到當(dāng)前單詞為結(jié)束符".&q
11、uot;表明源程序已分析結(jié)束。若未取到結(jié)束符".",而源程序已沒有輸入符號,這時表明源程序有錯誤,無法再繼續(xù)分析。</p><p> 圖 4 PL/X過程調(diào)用相關(guān)示意圖</p><p><b> 2.2 語法元素</b></p><p><b> 關(guān)鍵字:</b></p><p
12、> "and", "begin", "call", "case", "constant", "do", "else", "end", "false", "for", "if", "integer&quo
13、t;, "logical", "not", "or", “odd”,"procedure", "program", "read","repeat", "switch", "then", "true", "until",
14、 "while", "write"</p><p><b> 操作符:</b></p><p> ".", ";", "**", "++", “--", "+", "-", "*&quo
15、t;, "/", "%", "=", "<", "<=", ">", ">=", "==", "!","+=", "-=", "*=", "/="</
16、p><p><b> 2.3語法圖</b></p><p><b> 程序</b></p><p><b> 程序體</b></p><p><b> 語句序列</b></p><p><b> 語句</b&g
17、t;</p><p><b> 條件</b></p><p><b> 表達(dá)式</b></p><p><b> 項</b></p><p><b> 因子</b></p><p> prog = "progra
18、m" ds { proc } "begin" ss "end" "."</p><p> proc = "procedure" aident [ds] "begin" ss "end"</p><p> ds = d {";" d }&l
19、t;/p><p> d = "integer" aident {"," aident} |</p><p> "logical" bident {"," bident} |</p><p> "constant" aident "=" numbe
20、r {"," aident "=" number}</p><p> ss = s { ; s }</p><p> s = aident " := " ae |</p><p> bident " := " be |</p><p> "if
21、" be "then" ss ["else" ss] "end" |</p><p> "while" be "do" ss "end" |</p><p> "repeat" ss "until" be |</
22、p><p> "write" ae .</p><p> "read" aident | bident</p><p> "for" s ; be ; s "do" ss "end"</p><p> "call" pr
23、ocedure</p><p> "do" ss "." "while" be "end"</p><p> ae= ["-"] at {("-"|"+") at }</p><p> 8) at = af1 {(&quo
24、t;*"|"/") af1}.</p><p> 9) af1 = af {("%"|"**") af}. //擴(kuò)展的求余運(yùn)算</p><p> 10) af = aident | number | "(" ae ")" | constant</p><
25、;p> be = bt {"or" bt}</p><p> bt = bf {"and" bf }</p><p> bf = bident | "true" | "false" |"not" bf |"(" be ")" | re1&l
26、t;/p><p> re1=odd re</p><p> re = (aident | number )( "=" | ">" | ">=" | "<" | "<=" | "/=" ) ae</p><p> ds =
27、 d {";" d }</p><p> 2.4判斷是否符合兩條限制規(guī)則</p><p><b> 結(jié)構(gòu):</b></p><p> B1 = { proc }</p><p> First(B1) = {“procedure”};</p><p> Follow(
28、B1) = {“begin”};</p><p><b> B2 = [ds]</b></p><p> First(B2) = {“integer”, “l(fā)ogical”, “constant”};</p><p> Follow(B1) = {“begin”};</p><p> B3 = {";&
29、quot; d } </p><p> First(B3) = {“;”};</p><p> Follow(B3) = {“procedure”, “begin”};</p><p> B4 = {"," aident} </p><p> First(B4) = {“,”};</p><p&
30、gt; Follow(B4) = {“;”, “procedure”, “begin”};</p><p> B5 = {"," bident}</p><p> First(B5) = {“,”};</p><p> Follow(B5) = {“;”, “procedure”, “begin”};</p><p&g
31、t; B6 = {"," aident "=" number}</p><p> First(B6) = {“,”};</p><p> Follow(B6) = {“;”, “procedure”, “begin”};</p><p> B7 = { ; s } </p><p> Firs
32、t(B7) = {“;”};</p><p> Follow(B7) = {“end”, “until”, “else”};</p><p> B8 = ["else" ss] </p><p> First(B8) = {“else”};</p><p> Follow(B8) = {“end” };</p
33、><p> B9 = ["-"]</p><p> First(B9) = {“-”};</p><p> Follow(B9) = {“(”, “aident”, “number”, “constant” };</p><p> B10 = {("-"|"+") at }&
34、lt;/p><p> First(B10) = {“-”, “+”};</p><p> Follow(B10) = {“end”, “until”, “else”, “)”, “and”, “or” };</p><p> B11 = {"or" bt}</p><p> First(B11) = {“or”};&
35、lt;/p><p> Follow(B11) = {“then”, “do”, “;”, “)”, “end”, “until”, “else” };</p><p> B12 = {("*"|"/") af} </p><p> First(B12) = {"*", "/"};&l
36、t;/p><p> Follow(B12) = {“+”, “-“, “end”, “until”, “else”, “)”, “and”, “or”};</p><p> B13 = {"and" bf } </p><p> First(B13) = {"and”};</p><p> Follow(B1
37、3) = { “or”, “then”, “do”, “;”, “)”, “end”, “until”, “else”};</p><p> 2).判斷是否符合兩條限制規(guī)則</p><p> 規(guī)則1:找出圖中每一個分支點(diǎn),考察每個分支點(diǎn)的各個分支的頭符號是否相異</p><p> 規(guī)則2:找出圖中每一個結(jié)構(gòu),考察每個結(jié)構(gòu)的頭符號集合與其跟隨符號是否相異<
38、/p><p> 表 5 PL/X文法非終結(jié)符的開始符號與后繼符號集合表</p><p> 判斷結(jié)果:根據(jù)兩條限制規(guī)則,發(fā)現(xiàn)該語法圖分析符合兩條限制規(guī)則</p><p> 2.5 語法出錯表定義</p><p> 無,出錯信息均以字符串的形式在程序中標(biāo)出。</p><p><b> 3 虛擬機(jī)</b
39、></p><p> 3.1 虛擬機(jī)組織結(jié)構(gòu)</p><p> 程序存儲器 指令存儲器 數(shù)據(jù)存儲區(qū)</p><p> 程序地址寄存器 基本地址寄存器 地址寄存器</p><p><b> 程序存儲器</b></p><p><b> 指令類型</b>
40、</p><p> enum fct {lit,opr,lod,sto,cal,</p><p> Int,jmp,jpc</p><p><b> };</b></p><p><b> 指令</b></p><p> typedef struct
41、instruction {</p><p><b> fct f;</b></p><p><b> int l;</b></p><p><b> int a;</b></p><p> }Instruction;</p><p><b&
42、gt; 指令數(shù)組</b></p><p> Instruction code[InMax];</p><p><b> 指令寄存器</b></p><p><b> int i;</b></p><p><b> 數(shù)據(jù)存儲器</b></p>
43、<p> int stack[StMax]</p><p><b> 程序地址寄存器</b></p><p><b> int p;</b></p><p><b> 基本地址寄存器</b></p><p><b> int b;</b&
44、gt;</p><p><b> 地址寄存器</b></p><p><b> int t;</b></p><p> 3.2 虛擬機(jī)指令格式</p><p> 編譯程序所產(chǎn)生的目標(biāo)代碼是一個假想棧式計算機(jī)的匯編語言,可稱為類PCODE指令代碼,它不依賴任何具體計算機(jī),其指令集極為簡單,指令
45、格式也很單純,其格式如下:</p><p> 其中f代表功能碼,l表示層次差,也就是變量或過程被引用的分程序與說明該變量或過程的分程序之間的層次差。a的含意對不同的指令有所區(qū)別,對存取指令表示位移量,而對其它的指令則分別有不同的含義,見下面對每條指令的解釋說明。</p><p><b> 目標(biāo)指令有8條:</b></p><p> ① L
46、IT:將常量值取到運(yùn)行棧頂。a域?yàn)槌?shù)值。</p><p> ② LOD:將變量放到棧頂。a域?yàn)樽兞吭谒f明層中的相對位置,l為調(diào)用層與說明層的層差值。</p><p> ?、?STO:將棧頂?shù)膬?nèi)容送入某變量單元中。a,l域的含意同LOD指令。</p><p> ?、?CAL:調(diào)用過程的指令。a為被調(diào)用過程的目標(biāo)程序入口地址,l為層差。</p>&l
47、t;p> ?、?INT:為被調(diào)用的過程(或主程序)在運(yùn)行棧中開辟數(shù)據(jù)區(qū)。a域?yàn)殚_辟的單元個數(shù)。</p><p> ?、?JMP:無條件轉(zhuǎn)移指令,a為轉(zhuǎn)向地址。</p><p> ?、?JPC:條件轉(zhuǎn)移指令,當(dāng)棧頂?shù)牟紶栔禐榉钦鏁r,轉(zhuǎn)向a域的地址,否則順序執(zhí)行。</p><p> ⑧ OPR:關(guān)系運(yùn)算和算術(shù)運(yùn)算指令。將棧頂和次棧頂?shù)膬?nèi)容進(jìn)行運(yùn)算,結(jié)果存放在次棧
48、頂,此外還可以是讀寫等特殊功能的指令,具體操作由a域值給出。(詳見解釋執(zhí)行程序)。</p><p><b> 4 程序設(shè)計</b></p><p> 4.1 全局變量、全局常量</p><p> #define Number 26 //保留字的個數(shù)</p><p> #define TXMAX 100 //標(biāo)
49、識符表的長度</p><p> #define InMax 200 //指令最多條數(shù)</p><p> #define LeMax 3 //過程最大嵌套層次</p><p> #define StMax 500//最大棧長</p><p> #define IMax 10 //標(biāo)識符最長長度</p><p
50、> #define DMax 14 //數(shù)字允許的最長位數(shù)v</p><p> #define AddMax 2048 //最大地址</p><p> char ch;//最近一次從程序中讀出的字符</p><p> char sym[IMax];//最近讀出的符號</p><p> char id[IMax];/
51、/最近讀出的標(biāo)識符</p><p> int num;//最近讀出的數(shù)值</p><p> int cc;//行緩沖區(qū)指針</p><p> int ll;//行緩沖區(qū)長度</p><p> int kk; //提高性能</p><p> char line[100];//行緩沖區(qū)
52、</p><p> char a[IMax];//存放當(dāng)前正在分析的詞</p><p> int lineno;//當(dāng)前分析的行號</p><p> int tx=0;//符號表序號</p><p> int index;//指令索引</p><p> char ssym[13][IMax]
53、;//符號對應(yīng)的符號表</p><p> char fsym[33][IMax];//用于出錯處理</p><p> int err;//記錄錯誤數(shù)量</p><p> int stack[StMax];</p><p> FILE *file;//指向要編譯的源文件</p><p> char w
54、ord[Number][IMax] = { //保留字</p><p><b> "and",</b></p><p><b> "begin",</b></p><p><b> "call",</b></p><
55、p><b> "case",</b></p><p> "constant",</p><p><b> "do",</b></p><p><b> "else",</b></p><p
56、><b> "end",</b></p><p><b> "false",</b></p><p><b> "for",</b></p><p><b> "if",</b><
57、/p><p> "integer",</p><p> "logical",</p><p><b> "not",</b></p><p><b> "or",</b></p><p>&l
58、t;b> "odd",</b></p><p> "procedure",</p><p> "program",</p><p><b> "read",</b></p><p><b> "
59、repeat",</b></p><p><b> "switch",</b></p><p><b> "then",</b></p><p><b> "true",</b></p><p&
60、gt;<b> "until",</b></p><p><b> "while",</b></p><p><b> "write"</b></p><p><b> };</b></p><
61、;p> char wsym[Number][IMax] = {//保留字對應(yīng)的符號表</p><p><b> "andsym",</b></p><p> "beginsym",</p><p> "callsym",</p><p> &
62、quot;casesym",</p><p> "constsym",</p><p><b> "dosym",</b></p><p> "elsesym",</p><p><b> "endsym",<
63、;/b></p><p> "falsesym",</p><p><b> "forsym",</b></p><p><b> "ifsym",</b></p><p> "intesym",</
64、p><p> "logisym",</p><p><b> "notsym",</b></p><p><b> "orsym",</b></p><p><b> "oddsym",</b>
65、</p><p> "procsym",</p><p> "progsym",</p><p> "readsym",</p><p> "repeasym",</p><p> "switcsym",<
66、;/p><p> "thensym",</p><p> "truesym",</p><p> "untilsym",</p><p> "whilesym",</p><p> "writesym"</p
67、><p><b> };</b></p><p> char D_first[4][IMax] = {//聲明語句頭符號集</p><p> "intesym",</p><p> "logisym",</p><p> "constan
68、t",</p><p><b> "over"</b></p><p><b> };</b></p><p> char D_follow[3][IMax] = {//聲明語句跟隨符號集</p><p> "beginsym",</
69、p><p> "procsym",</p><p><b> "over"</b></p><p><b> };</b></p><p> char S_first[11][IMax] = {//語句的頭符號集</p><p>
70、<b> "adient",</b></p><p><b> "ifsym",</b></p><p> "whilesym",</p><p> "repeasym",</p><p> "wri
71、tesym",</p><p><b> "forsym",</b></p><p> "callsym",</p><p> "readsym",</p><p><b> "dosym",</b>&
72、lt;/p><p> "switcsym",</p><p><b> "over"</b></p><p><b> };</b></p><p> char S_follow[7][IMax] = {//語句的跟隨符號集</p><
73、;p><b> "endsym",</b></p><p> "elsesym",</p><p> "untilsym",</p><p><b> "dosym",</b></p><p><b&
74、gt; "period",</b></p><p><b> "over"</b></p><p><b> };</b></p><p> enum fct {//指令類型</p><p><b> lit,</b
75、></p><p><b> opr,</b></p><p><b> lod,</b></p><p><b> sto,</b></p><p><b> cal,</b></p><p><b>
76、; Int,</b></p><p><b> jmp,</b></p><p><b> jpc</b></p><p><b> };</b></p><p> enum objekt {//標(biāo)識符類型</p><p>
77、<b> integer,</b></p><p><b> logical,</b></p><p> procedure,</p><p><b> constant</b></p><p><b> };</b></p>
78、<p> typedef struct instruction {</p><p><b> fct f;</b></p><p><b> int l;</b></p><p><b> int a;</b></p><p> }Instruction;
79、</p><p> Instruction code[InMax];//指令數(shù)組</p><p> typedef struct Table {//符號表定義</p><p> char name[IMax];</p><p> objekt kind;</p><p><b> int adr
80、;</b></p><p> int level;</p><p><b> int size;</b></p><p><b> }Table;</b></p><p> Table table[TXMAX];//符號表</p><p><b&
81、gt; 4.2 函數(shù)接口</b></p><p> 5.編譯器功能的實(shí)現(xiàn)</p><p><b> 5.1 概述</b></p><p><b> 5.2 實(shí)例一</b></p><p><b> 5.3 實(shí)例二</b></p><p&
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 編譯原理課程設(shè)計報告--編譯器實(shí)現(xiàn)
- 編譯原理課程設(shè)計報告_編譯器
- 編譯原理課程設(shè)計---編譯器的實(shí)現(xiàn)
- 編譯原理課程設(shè)計--編譯器
- 編譯原理課程設(shè)計--c語言編譯器實(shí)現(xiàn)
- 編譯原理課程設(shè)計--c語言編譯器實(shí)現(xiàn)
- c語言編譯器實(shí)現(xiàn)-編譯原理課程設(shè)計
- 編譯原理課程設(shè)計____c語言編譯器的實(shí)現(xiàn)-
- 編譯原理課程設(shè)計---c語言編譯器的實(shí)現(xiàn)
- 編譯原理課程設(shè)計---簡單編譯器的設(shè)計與實(shí)現(xiàn)
- 編譯原理課程設(shè)計報告-簡單文法的編譯器的設(shè)計與實(shí)現(xiàn)
- 編譯原理課程設(shè)計---s語言的編譯器的設(shè)計與實(shí)現(xiàn)
- 編譯原理課程設(shè)計報告(一個完整的編譯器)
- 編譯原理課程設(shè)計報告--pl0編譯器的擴(kuò)充
- 編譯原理課程設(shè)計___c語言編譯器的實(shí)現(xiàn)畢業(yè)論文
- 編譯原理課程的設(shè)計--c語言編譯器
- 編譯原理課程設(shè)計-pl_0編譯器及其擴(kuò)充
- 編譯原理課程設(shè)計---小型程序設(shè)計語言編譯器的設(shè)計與實(shí)現(xiàn)
- 編譯原理課程設(shè)計--一個簡單文法的編譯器的設(shè)計與實(shí)現(xiàn)
- 編譯原理課程設(shè)計--一個簡單文法的編譯器前端的設(shè)計與實(shí)現(xiàn)
評論
0/150
提交評論