編譯原理課程設計報告編譯程序構造_第1頁
編譯原理課程設計報告編譯程序構造_第2頁
編譯原理課程設計報告編譯程序構造_第3頁
編譯原理課程設計報告編譯程序構造_第4頁
編譯原理課程設計報告編譯程序構造_第5頁
已閱讀5頁,還剩20頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、目 錄第一章 緒論21.1課程設計目的21.2課程設計要求21.3課程設計內容21.3.1課設題目21.3.2課設內容21.3.3具體要求21.3.4程序設計提示31.3.5測試數(shù)據(jù)31.4課程設計環(huán)境3第二章 設計方案32.1模塊劃分32.2模塊調用關系圖32.3每個模塊流程圖32.3.1詞法分析模塊流程圖32.3.2語法分析模塊流程圖32.3.3主程序流程圖3第三章 程序代碼設計33.1數(shù)據(jù)結構設計33.2設計分析表33.3詞法分析設計33.4語法和語義分析設計3第四章 程序測試和結果34.1程序測試34.2 運行結果3第五章 總結3參考文獻3附錄3源程序代碼3程序使用說明書3第一章 緒論

2、1.1課程設計目的編譯原理課程設計是編譯原理課程必不可少的一個環(huán)節(jié),通過課程設計,加深對編譯原理的教學內容的了解,以及實現(xiàn)編譯原理各部分知識的融合。進而提高學生分析問題、解決問題,從而運用所學知識解決實際問題的能力。1.2課程設計要求1明確課設任務,復習與查閱有關資料2按要求完成課設內容,課設報告要求文字和圖工整、思路清楚、正確。3注意增強程序界面的友好性。凡用戶輸入時,給出足夠的提示信息使用戶感到方便使用。4注意提高程序的可讀性和可理解性:程序中應有適當?shù)淖⑨?,變量命名應符合實際含義,程序結構清晰,易于閱讀和理解。1.3課程設計內容1.3.1課設題目編譯程序構造1.3.2課設內容涉及詞法分析

3、、自下而上語法分析程序的實現(xiàn):slr(1)分析器的實現(xiàn)以及生成中間代碼。1.3.3具體要求根據(jù)lr分析算法構造slr(1)分析程序,并完成語法分析動作(當需要一個單詞時,調用詞法分析程序獲?。瑫r完成語義分析生成四元式輸出。要求程序具有通用性,改變文法時只需改變程序的數(shù)據(jù)初值,無需改變程序主體;要求完成一條說明語句、一條算數(shù)表達式和賦值語句的翻譯,生成中間代碼。變量說明語句的文法及相應的語義子程序:.att表示數(shù)據(jù)類型屬性,fill函數(shù)表示將單詞id及其類別屬性填寫符號表。(0)sd; acc(1)dint id fill(id,int);d.att=int; (2)dfloat id fi

4、ll(id,float); d.att=float; (3)dd(1),id fill(id,d(1).att);d.att=d(1).att; 算數(shù)表達式和賦值語句的文法及相應的語義子程序。(1)aid=e; p=lookup();emit(=, e.palce , _, p); (2)ee(1)+t e.palce=newtemp(); emit(+,e(1).palce,t.palce,e.palce)(3)et e.palce=t.palce;(4)tt(1)*f t.palce=newtemp(); emit(*,t(1).palce,f.palce,t.palce)(

5、5)tf t.palce=f.palce;(6)f(e) f.palce=e.palce;(7)fid p=lookup()f.palce=p;構造其用于slr(1)分析的識別活前綴的dfa以及action表和goto表。然后編程實現(xiàn)。(關于詞法分析部分只需識別出與此文法相關的單詞即可(+,*,(,),id,=)。1.3.4程序設計提示(1)分析棧設計時可以用一個棧完成,也可以設計三個棧:一個符號棧,一個狀態(tài)棧,一個語義棧,則歸約時,則需要在符號棧中退掉n個符號,在狀態(tài)棧中退掉n個符號(n為產(chǎn)生式符號個數(shù)),語義棧中退掉n個符號對應的語義;(2)終結符表和非終結符表的組織和預測分

6、析程序中相同(將符號對應到一個數(shù)字,表示在分析表中對應的下標)。(3)action表中的錯誤處理:簡化的錯誤處理:當查找action表出現(xiàn)空白時,則當前單詞無法移進和規(guī)約,可簡單的認為當前單詞為多余的單詞,則拋棄當前單詞,讀下一單詞繼續(xù)分析。1.3.5測試數(shù)據(jù)作為程序測試數(shù)據(jù),以賦值語句area=r*r+r$作為測試輸入(源程序)。程序要求輸出二元式序列、符號表、語法分析過程、四元式序列。假設aa.txt的文件內容如下: int area,r; area=r*r+r;程序運行情況如下:請輸入源文件名稱:e:aa.txt語法分析過程如下: 狀態(tài)棧 符號棧 語義棧 動作說明源程序對應的二元式如下:

7、 (int,-) (id,0) (,-) (id,1) (;,-)(id,0)(=,)(id,1) (*,) (id,1) (+,) (id,1) (;,-)符號表如下:arear 源程序對應的四元式序列如下: (*,r,r,t1) (+,t1,r,t2) (=,t2,area)分析過程完成。1.4課程設計環(huán)境硬件環(huán)境:圖書館五樓計算機系軟一實驗室;軟件環(huán)境:jcreator第二章 設計方案2.1模塊劃分 將系統(tǒng)模塊劃分為四個模塊:數(shù)據(jù)結構模塊,詞法分析模塊,slr(1)分析程序模塊和語義分析模塊。輸入或讀取文件符號表獲得代碼進行詞法分析二元式判斷文法輸出四元式表達式文法分析聲明文法分析分析過

8、程slr(1)分析程序模塊語義分析模塊詞法分析模塊數(shù)據(jù)結構模塊2.2模塊調用關系圖2.3每個模塊流程圖2.3.1詞法分析模塊流程圖轉化成單詞數(shù)組獲得代碼結束,返回所有單詞計數(shù)器小于單詞個數(shù)獲得單個單詞關鍵字加入二元式表是標識符,加入符號表,加入二元式表計數(shù)器加12.3.2語法分析模塊流程圖初始化狀態(tài)棧和符號棧判斷當前字符根據(jù)當前字符和狀態(tài),查找slr分析表判斷action結束規(guī)約(生成四元式)移進將處理過程放入處理數(shù)組,字符串指針,各棧頂指針變化,各棧棧內內容變化2.3.3主程序流程圖調用詞法分析函數(shù)并輸出二元式輸入源程序文件名打印四元式調用slr(1)分析程序打印標識符表和常量表第三章 程序

9、代碼設計3.1數(shù)據(jù)結構設計分隔符: char arr1 = , ;, , , (, ), ; 運算符: char arr = +, -, *, /, =, ;關鍵字: string key = int, float, char, while, if ; 存儲二元式: eryuan er = new eryuan();數(shù)字位置: int num = 0;標識符位置: int id_;string vn0 = d, s ;string vt0 = ;, int, float, , id, # ;非終結符: string vn = e, t, f, a ; 終結符: string vt = id,

10、=, +, *, (, ), ;, # ; 非終結符個數(shù): int lengthvn = 3; 終結符個數(shù): int lengthvt = 8; 狀態(tài)數(shù): int lengthzt = 15; 規(guī)約數(shù)組: int guiyue0;算數(shù)表達式和賦值語句文法的goto子表: int goto1;算數(shù)表達式和賦值語句文法的action子表: int action;標識符: string ident = new string100;標識符數(shù): int countid = 0;存儲四元式: siyuan si = new siyuan50; 存儲臨時變量tn :string ident_t = new

11、string100;tn的個數(shù):int lengthidt = 0;輸入的字符串: string input0;3.2設計分析表變量說明語句的文法及相應的語義子程序:.att表示數(shù)據(jù)類型屬性,fill函數(shù)表示將單詞id及其類別屬性填寫符號表。(0)sd; acc(1)dint id fill(id,int);d.att=int; (2)dfloat id fill(id,float); d.att=float; (3)dd(1),id fill(id,d(1).att);d.att=d(1).att; i0:s d;d int idd float idd d , iddi1:s d ;d d

12、, idinti2:d int ididi6:d int id floati3:d float idi7:d float id ,i5:d d , ididi8:d d , id i4:s d ; id;follow(s) = #follow(d) = , ;狀態(tài)actiongoto;intfloat,id#d0s2s311s4s52s63s74acc5s86r1r17r2r28r3r33.3詞法分析設計boolean isfengefu(string str) 判斷i當前所指的字符是否為一個分界符,是的話返回真,反之返回假void isnum(string str) 此函數(shù)判斷傳遞的參數(shù)是否

13、為數(shù)字,是的話返回真,反之返回假void isid(string str) 此函數(shù)判斷傳遞的參數(shù)是否為標識符,是的話返回真,反之返回假boolean isoperation(string str) 判斷i當前所指的字符是否為一個運算符,是的話返回真,反之返回假void result(string a) 將字符串分類,得到數(shù)字、關鍵字、標識符等 a=a.trim();if (a.equals(null) | a.equals(n) | a.length() = 0|a.equals( )return;try if (a.length() = 1) if (a.equals(,) | a.equa

14、ls(;) | a.equals()| a.equals() | a.equals() | a.equals()| a.equals()isfengefu(a);else if (a.equals(+) | a.equals(-) | a.equals(*)| a.equals(/) | a.equals(=) | a.equals()isoperation(a);else if (a.charat(0) = 0)isnum(a);elseisid(a); else if (a.charat(0) = 0) for (int k = 1; k = a.length(); k+)if (a.ch

15、arat(k) = 0)| a.charat(k) = .)continue;isnum(a); else if (iskey(a);elseisid(a); catch (exception ee) system.out.println(ee);boolean iskey(string str) 此函數(shù)判斷傳遞的參數(shù)是否為關鍵字,是的話,返回真,反之返回假void isnum(string strclass eryuan) 存儲二元式void show() 輸出二元式3.4語法和語義分析設計boolean isdelim(char c) 返回是否是終結符中字符void yufa( ) 語法分

16、析,中間嵌套語義分析(主要代碼分析) x = stack.gethead();/ 得到棧頂狀態(tài)值value = actionxa;/ value為下一狀態(tài)值while (true) system.out.println();stack.show();/ 輸出各個棧頂值if (value = 0 & value = 100)/ 歸約 int size, vn_temp, id_temp;value = value - 100;vn_temp = guiyuevalue0;size = guiyuevalue1;int id = new intsize;for (i = 1; i = size;

17、i+) temp = stack.pop();idi - 1 = temp.yuyi;/ 獲得語義棧的值if (temp = null) system.out.println(出棧錯誤!);return;string getid(int x) 返回標識符或者臨時標識符void emit()存儲四元式class stack 堆棧void show() 輸出四元式int tempid() 產(chǎn)生臨時標識符void error(int i)/ 錯誤處理b = false;system.out.print(n出錯:);switch (i) case 1:system.out.println(非法字符!)

18、;break;case 2:system.out.println(有語義錯誤!);break;case 3:system.out.println(無結尾符號!);break;算數(shù)表達式和賦值語句的文法及相應的語義子程序。(0)aid=e; p=lookup();emit(e.palce, , p); (1)ee(1)+t e.palce=newtemp(); emit(+,e(1).palce,t.palce,e.palce)(2)et e.palce=t.palce;(3)tt(1)*f t.palce=newtemp(); emit(+,t(1).palce,f.palce,

19、t.palce)(4)tf t.palce=f.palce;(5)f(e) f.palce=e.palce;(6)fid p=lookup()f.palce=p;i1:a id = e;=ei2:a id = e;e e + te tt t * ft ff ( e )f id+i3:a id = e ;e e + tti12:e e + t t t * fi5:t f f(i6:f ( e )e e + te tt t * ft ff ( e )f id*id(i13:t t * f i4:e t t t * ftfi10:t t * ff ( e )f idi7:f id id

20、id(fid*i14:f ( e ) i11:f ( e )e e + te)i0:a id = e;id+fi9:e e + tt t * ft ff ( e )f idt(i8:a id = e ; ;follow(a) = #;follow(e) = ;, +, );follow(t) = *, ;, +, );follow(f) = *, ;, +, );狀態(tài)actiongotoid=+*();#etf0s11s22s7s63453s9s84r210r2r25r4r4r4r46s7s611457r6r6r6r68acc9s7s612510s7s61311s9s1412r1s10r1r1

21、13r3r3r3r314r5r5r5r5第四章 程序測試和結果4.1程序測試源程序: hou.txt4.2 運行結果1.詞法分析結果:如圖 2.slr(1) 運行結果:如圖3.語義運行結果:如圖第五章 總結本次課程設計涉及詞法分析、自下而上語法分析程序的實現(xiàn),slr(1)分析器的實現(xiàn)以及生成中間代碼。要求根據(jù)lr分析算法構造slr(1)分析程序,并完成語法分析動作,同時完成語義分析生成四元式輸出。通過兩個星期的實驗,已經(jīng)順利完成了任務。在這次課設當中,感覺到編譯原理強大的理論性和抽象性,有了平時做實驗的基礎不會覺得無從下手,但是對于實現(xiàn)各個功能的函數(shù)的連接覺得很困惑。后來經(jīng)過上網(wǎng)查閱資料,請教

22、老師和同學,我學到了不少東西,對聲明文法的分析中用到了詞法分析中產(chǎn)生的符號表,利用參數(shù)傳遞此符號表,產(chǎn)生說明語句的編譯過程。此程序還有一些不足的地方。其一,就是不能全面的容錯,當輸入錯誤的語句時不能夠分析出來,而且對于不同屬性的各標識符進行運算時沒有相應的容錯判斷,如果有時間還有待于提高,這也是一個巨大的工作。其二,不是圖形用戶界面,只在運行結果中顯示,作為軟件使用不夠方面。我們都該努力地追求實用性。編譯原理是計算機專業(yè)的重要專業(yè)課之一。而實驗又是學好編譯原理課程的重要環(huán)節(jié),設計一個與理論內容相適宜的實驗是整體上提高編譯原理能力決定性因素。在此次課程設計中我學到了很多,遇到的困難也帶給我感受很

23、多。通過這個全面的編譯原理的實驗我很大的提高了自己認真思考和自學的能力。同時感謝老師和同學的教導與幫助。我會在今后的學習中更加努力。參考文獻1胡元義。 編譯原理教程。 西安: 西安電子科技大學出版社, 2006.4。2陳火旺,劉春林等,程序設計語言編譯原理(第三版)。北京:國防工業(yè)出版社,2000。3蔣立源,康幕寧主編,編譯原理。 西安:西北工業(yè)大學出版社,2000.34周靄如,林偉健. c+程序設計基礎。北京:電子工業(yè)出版社, 2006.4。 5 侯文泳,張冬沫編著,編譯原理教程。北京:電子工業(yè)出版社. 2004。附錄源程序代碼cifa.javapackage com.yang.ks;cla

24、ss cifa char arr1 = , ;, , , (, ), ;/ 分隔符char arr = +, -, *, /, =, ;/ 運算符string key = int, float, char, while, if ;/ 關鍵字eryuan er = new eryuan();/ 存儲二元式int num = 0;/ 數(shù)字位置int id_;/ 標識符位置node1 node1 = new node150;void cifa(string s) int begin = 0, end = 0;try do try for (; begin+)if (s.charat(begin) !

25、= & s.charat(begin) != n)break; catch (exception e) / todo auto-generated catch blocke.printstacktrace();string nowstring = null;string nowstring1 = ;try int r;for (r = begin; r = s.length()break;nowstring = s.substring(begin, end);/ 返回定長字符串result(nowstring);result(nowstring1);begin = end + 1; while

26、 (true); catch (exception ee) system.out.println(ee);boolean isfengefu(string str)/ 判斷i當前所指的字符是否為一個分界符,是的話返回真,反之假node1 node = new node1();for (int t = 0; t 7; t+)try if (str.charat(0) = arr1t) node.num = -1;node.str = str;er.add(node);return true; catch (exception e) e.printstacktrace();return false

27、;void isnum(string str)/ 此函數(shù)判斷傳遞的參數(shù)是否為數(shù)字,是的話,返回真,反之返回假node1 node = new node1();node.num = num;node.str = str;er.add(node);num+;void isid(string str)/ 此函數(shù)判斷傳遞的參數(shù)是否為標識符,是的話,返回真,反之返回假if (str = n)return;node1 node = new node1();int flag = 0;for (int r = 0; r node1.length; r+) try if (node1r.str.equals()

28、break;if (str.equals(node1r.str) node.num = node1r.num;node.str = node1r.str;er.add(node);flag = 1;break; catch (exception e) / todo auto-generated catch blocke.printstacktrace();if (flag = 0) node.num = id_;node.str = str;er.add(node);id_+;boolean isoperation(string str)/ 判斷i當前所指的字符是否為一個運算符,是的話返回真,

29、反之假node1 node = new node1();for (int t = 0; t 7; t+)try if (str.charat(0) = arrt) node.num = -1;node.str = str;er.add(node); catch (exception e) e.printstacktrace();return false;void result(string a)/ 將字符串分類,得到數(shù)字、關鍵字、標識符等 a=a.trim();if (a.equals(null) | a.equals(n) | a.length() = 0|a.equals( )return

30、;try if (a.length() = 1) if (a.equals(,) | a.equals(;) | a.equals()| a.equals() | a.equals() | a.equals()| a.equals()isfengefu(a);else if (a.equals(+) | a.equals(-) | a.equals(*)| a.equals(/) | a.equals(=) | a.equals()isoperation(a);else if (a.charat(0) = 0)isnum(a);elseisid(a); else if (a.charat(0)

31、 = 0) for (int k = 1; k = a.length(); k+)if (a.charat(k) = 0)| a.charat(k) = .)continue;isnum(a); else if (iskey(a);elseisid(a); catch (exception ee) system.out.println(ee);boolean iskey(string str)/ 此函數(shù)判斷傳遞的參數(shù)是否為關鍵字,是的話,返回真,反之返回假for (int i = 0; i 5; i+) if (str.equals(keyi) node1 node = new node1()

32、;node.num = -1;node.str = str;er.add(node);return true;return false;class eryuan/ 存儲二元式int i = -1;void add(node1 x) try i+;node1i = new node1();node1i.str = x.str;node1i.num = x.num; catch (exception e) / todo auto-generated catch blocke.printstacktrace();void show()/ 輸出二元式system.out.println(二元式為:);

33、for (int j = 0; j 49) error(3);return;if (inputto.charat(i + 1) = )i+;atj = inputto.charat(i + 1);i+;j+;atj = #;input = new string(at, 0, j + 1);int gotot2 = -1, -1, -1 , -1, -1, -1 , 3, 4, 5 , -1, -1, -1 , -1, -1, -1 , -1, -1, -1 , 11, 4, 5 , -1, -1, -1 , -1, -1, -1 , -1, 12, 5 , -1, -1, 13 , -1, -

34、1, -1 , -1, -1, -1 , -1, -1, -1 , -1, -1, -1 ;goto1 = gotot2;int action2 = 1, -1, -1, -1, -1, -1, -1, -1 ,/ 0 -1, 2, -1, -1, -1, -1, -1, -1 ,/ 1 7, -1, -1, -1, 6, -1, -1, -1 ,/ 2 -1, -1, 9, -1, -1, -1, 8, -1 ,/ 3 -1, -1, 102, 10, -1, 102, 102, -1 ,/ 4 -1, -1, 104, 104, -1, 104, 104, -1 ,/ 5 7, -1, -

35、1, -1, 6, -1, -1, -1 ,/ 6 -1, -1, 106, 106, -1, 106, 106, -1 ,/ 7 -1, -1, -1, -1, -1, -1, -1, 100 ,/ 8 7, -1, -1, -1, 6, -1, -1, -1 ,/ 9 7, -1, -1, -1, 6, -1, -1, -1 ,/ 10 -1, -1, 9, -1, -1, 14, -1, -1 ,/ 11 -1, -1, 101, 10, -1, 101, 101, -1 ,/ 12 -1, -1, 103, 103, -1, 103, 103, -1 ,/ 13 -1, -1, 105

36、, 105, -1, 105, 105, -1 / 14;action = action2;int guiyue2 = 3, 4 , 0, 3 , 0, 1 , 1, 3 , 1, 1 , 2, 3 , 2, 1 ;guiyue = guiyue2;node gettoken()node node = new node();string token = new string();if (isdelim(input.charat(idex)/ 判斷是否為終結符token += input.charat(idex);switch (token.tochararray()0) case n:node.vt = 8;break;case :node.vt = 8;break;case =:node.vt = 1;break;case +:node.vt = 2;break;case *:node.vt = 3;break;case (:node.vt = 4;break;case ):node.vt = 5;break;case ;:node.vt = 6;break;

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論