第一篇:編譯原理實驗報告
編譯原理實驗報告
報告完成日期 2018.5.30
一. 組內分工與貢獻介紹
二. 系統功能概述;
我們使用了自動生成系統來完成我們的實驗內容。我們設計的系統在完成了實驗基本要求的前提下,進行了一部分的擴展。增加了聲明變量類型、類型賦值判定和聲明的變量被引用時作用域的判斷。從而使得我們的實驗結果呈現的更加清晰和易懂。
三. 分系統報告;
一、詞法分析子系統
詞法的正規式:
標識符
<字母>(<字母>|<數字字符>)* 十進制整數
0 |(1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)* 八進制整數 0(1|2|3|4|5|6|7)(0|1|2|3|4|5|6|7)* 十六進制整數 0x(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)* 運算符和分隔符 +| * | / | > | < | = |(|)| <=|>=|==; 對于標識符和關鍵字: A5—〉 B5C5 B5—〉a | b |??| y | z C5—〉(a | b |??| y | z |0|1|2|3|4|5|6|7|8|9)C5|ε 綜上正規文法為: S—〉I1|I2|I3|A4|A5 I1—〉0|A1 A1—〉B1C1|ε C1—〉E1D1|ε D1—〉E1C1|ε
E1—〉0|1|2|3|4|5|6|7|8|9 B1—〉1|2|3|4|5|6|7|8|9 I2—〉0A2 A2—〉0|B2 B2—〉C2D2 D2—〉F2E2|ε E2—〉F2D2|ε
C2—〉1|2|3|4|5|6|7 F2—〉0|1|2|3|4|5|6|7 I3—〉0xA3 A3—〉B3C3 B3—〉0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f C3—〉(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)|C3|ε
A4—〉+ |-| * | / | > | < | = |(|)| <=|>=|==; A5—〉 B5C5 B5—〉a | b |??| y | z C5—〉(a | b |??| y | z |0|1|2|3|4|5|6|7|8|9)C5|ε
狀態圖
流程圖:
詞法分析程序的主要數據結構與算法
考慮到報告的整潔性和整體觀感,此處我們僅展示主要的程序代碼和算法,具體的全部代碼將在整體的壓縮包中一并呈現
另外我們考慮到后續實驗中,如果在bison語法樹生成的時候推不出目標的產生式時,我們設計了報錯提示,在這個詞的位置出現錯誤提示,將記錄切割出來的詞在code.txt中保存,并記錄他們的位置。
以下是我們的主要代碼:
進制的識別:
結果展示:
二、語法分析子系統
根據選擇的語法分析方法進行描述
我們使用了遞歸子程序發,并且對原有的產生式進行了改寫,改寫后的結果如下: P→LP1|L L→S
S→id=E|{P}|if C then S | if C then S
1else S2 | while C do S1 C→E1C’
C’→>E2| E→int8E’| int10E’| int16E’| idE’|T E’→+T|-T||+TE’|-TE’ T→int8T’| int10T’| int16T’| idT’|F T’→*F|/F|*FT’|/FT’ F→(E)|int8|int10|int16|id 簡化的語法圖: S的語法圖: C的語法圖: E的語法圖: T的語法圖: F的語法圖: 流程圖: 語法分析子系統的主要數據結構與算法 我們采用了自動生成技術,同樣在這里也是展示主要的核心功能代碼,全部的代碼展示在壓縮包中: 我們在設計時,實現了產生式對應的字符串同時標識產生式定義的int值 輔助程序: 生成語法樹的程序: 1.樹節點: 2.創建新節點 3.創建實數類型新節點 4.創建標識符類型新節點 5.輸出語法樹 三、三地址碼生成器 算法的基本思想: 我們增加了聲明變量類型、類型賦值判定和聲明的變量被引用時作用域的判斷。從而使得我們的實驗結果呈現的更加清晰和易懂。 在報錯的時候,我們會呈現類型、作用域和賦值三種的問題的報錯信息。 流程圖: 算法展示: 四、實驗體會 這次實驗其實總的來說是讓我們更加清晰的理解到了我們所學的內容。有時候我們上課聽講,課下復習寫作業的時候,其實看似掌握了所學內容,但實際上并沒有親身體會的操作很難讓我們深刻的理解其中的相關意義。通過這次實驗,我們能夠從根源處了解到了我們所學的內容,并且基于我們理解之后的輸出。比如詞法分析不能采用空格來區分單詞,因為存在加減乘除等運算符和分隔符,使用空格來區分可能會造成錯誤的分解。又比如我們再在程序設計中,常常體會到效率的重要性。影響詞法分析的效率的主要因素是各個狀態的分支如何規劃。如果每個進來的單詞都能在最短的時間和最少的匹配次數內找到其入口,則效率將得到很大程度上的提高。所以由此我們產生了聲明變量類型、賦值和作用域的想法,將其放在最后來進行判斷,這樣可以提高整體的執行效率。 另外,這次小組成員彼此不在一個班級,這樣從某一方面來說,也加強了我們互相快速熟識并團結協作的能力,有了這種體驗,我想我們在今后的生活中,面對這種情況的時候,將會變得更加有經驗。 五、源程序 詞法分析器: 輸入結果: 輸出結果: 語義分析結果: 輸入: 第二組數據的輸入: 輸出: 三地址碼的輸入: 第二組數據的輸入: 輸出: 實驗2:語法分析 1.實驗題目和要求 題目:語法分析程序的設計與實現。 實驗內容:編寫語法分析程序,實現對算術表達式的語法分析。要求所分析算術表達式由如下的文法產生。 E?E?T|E?T|TT?T*F|T/F|F F?id|(E)|num實驗要求:在對輸入表達式進行分析的過程中,輸出所采用的產生式。方法1:編寫遞歸調用程序實現自頂向下的分析。方法2:編寫LL(1)語法分析程序,要求如下。 (1)編程實現算法4.2,為給定文法自動構造預測分析表。(2)編程實現算法4.1,構造LL(1)預測分析程序。 方法3:編寫語法分析程序實現自底向上的分析,要求如下。(1)構造識別所有活前綴的DFA。(2)構造LR分析表。 (3)編程實現算法4.3,構造LR分析程序。 方法4:利用YACC自動生成語法分析程序,調用LEX自動生成的詞法分析程序。實現(采用方法1) 1.1.步驟: 1)對文法消除左遞歸 E?TE'E'??TE'|?TE'|?T?FT'T'?*FT'|/FT'|?F?id|(E)|num 2)畫出狀態轉換圖 化簡得: 3)源程序 在程序中I表示id N表示num 1.2.例子: a)例子1 輸入:I+(N*N)輸出: b)例子2 輸入:I-NN 輸出: 吉林大學計算機科學與技術學院實驗報告 計算機基礎實驗教學中心編制 姓名,學號:胡智超,53070108;陳玉娟,53070130;程明,53070109;張宇航,53070110 2007 級1班 實驗室:A209成績指導教師(簽字)(存檔) —————————————————————————————————————————————— ★ 實驗課程名稱: ★ 實驗 項 目: ★ 實驗 儀 器: ★ 實驗 要 求: ★ 實驗步驟、分析設計與結果: 一.實驗序號:《編譯原理》第一次實驗 二.實驗題目:詞法分析 三.實驗日期:2010.10 四.實驗環境(操作系統,開發語言) 操作系統:Windows 開發語言:C 五.實驗內容(實驗要求) a)將標識符的詞法改為“以大寫字母或小寫字母開頭,后面可以跟大寫字 母或小寫字母或數字或下劃線”。 b)將<條件>中的表示相等關系的單詞“=”改為“= =” c)將原來的無小數的數改為可以有小數的數 六.實驗步驟 a)打開VC++,找到getsym()項目。 int getsym() {...} 在getsym()函數中設置斷點,F10逐過程調試 根據要求a修改為 if(ch>='a'&&ch<='z'||ch>='A'&&ch<='Z') 往后面看,修改while(ch>='a' && ch<='z' || ch>='0' && ch<='9' ||ch>='A' && ch<='Z' || ch=='_'); b)在檢測賦值符號的程序段中找到等號 = 的判斷代碼,改變成為 = = 即 可。 c)在獲取整數數字的值的程序段后面添加判斷小數點的代碼。如果是,即 讀取符號并且按照小數的要求將其縮小并且累加到總的符號串中。 七.實驗體會(包括收獲、心得體會、存在的問題及解決問題的方法、建議等) 通過實驗,如果要修改代碼的話,首先應該讀懂源碼,在修改之前了解到程序段的功能是什么,然后再在相應的行進行修改添加,再進行合理的調試。如果問題太過困難可以查詢資料或與同學進行討論 八.實驗結果(關鍵源程序) a) int getsym() { int i,j,k; while(ch==' '||ch==10||ch==9)/*忽略空格,換行和TAB*/{ getchdo; } if(ch>='a'&&ch<='z'||ch>='A'&&ch<='Z')/*名字或保留字以a..zA。Z開頭*/{ k=0; do{ if(k { a[k]=ch; k++; } getchdo; }while(ch>='a' && ch<='z' || ch>='0' && ch<='9' || ch>='A' && ch<='Z' || ch=='_');// if(ch>='0'&&ch<='9')/*檢測是否為數字,以0..9開頭*/{ k=0; num=0; sym=number; do{ //435 num=10*num+ch-'0'; k++; getchdo; }while(ch>='0' && ch<='9'); if(ch=='.') { k++; sym=period; getchdo; sym=number; int div=10; do{num=num+(ch-'0')/div; k++; getchdo; div=div*10; }while(ch>='0'&&ch<='9'); } b) else { if(ch=='>')//檢測大于或大于等于符號{ getchdo; if(ch=='=')//add by M { sym=geq;//構成>= getchdo; } else { sym=gtr;//否則就是一個單獨的>號} } else { if(ch=='=') { getchdo; if(ch=='=') { sym=deq; getchdo; } else { sym=eql; } } c)else {if(ch == ’.’) {k=10; getchdo; do{num=num+(ch-'0')/k; k=k*10; getchdo; }while(ch>='0'&&ch<='9');} } 國際學院 0802 楊良燕 200819100227 《編譯原理》課程學習心得 《編譯原理》是計算機專業的一門重要課程,正如教材 第一章的引論所述,“編譯程序是現代計算機系統的基本組成部分之一”。“一個編譯程序就是一個語言翻譯程序,語言翻譯程序把一種語言(源語言)書寫的程序翻譯成另一種語言(目標語言)的等價程序”。 通過這一學期的學習,我覺得編譯原理是一門理論性很強的課程,從文法和語言的概念到LL(1)文法和LR(0)文法的分析,幾乎都是對具體問題的抽象。因而,我們需要更多的時間來理解、掌握相關的知識,當然在這一過程中也存在很多問題,比如我們后期學習具體文法的分析方法時,對于文法的概念不夠清晰,影響了上課的效率,知道老師再次給我們講解了文法等基礎的知識點,我們才慢慢掌握后面所學的LL(1)文法等,也發現了知識點之間的關聯。此外,這門課程的課時被安排得很少,一周只有一次,這樣很不利于我們對這門重要課程的理解和掌握。但是我覺得我們很幸運,因為老師在有限的課程中盡量將知識點以比較容易接受的方式給我們講解,教我們用簡單的方法理解記憶不同的知識,對于我們提出的問題,無論課上或是課外,老師一直是不厭其煩,甚至利用課余時間為我們講解重要的難題。 編譯原理這門課程不僅僅在于其本身的理論價值,更在于為我們解決問題提供的思維方式和方法。從LL(1)到LR(0),問題不斷被解決的同時,又有一個個新的問題提了出來。對計算機語言世界的知識積累,像滾雪球一樣越滾越大。這個逐漸遞進,逐漸解決問題的過程對我來說是收獲很大的。整個過程好像踏著前人研究編譯理論的路線,不斷感覺他們遇到的問題,更重要的是他們解決問題的思路。編譯原理的課程帶給我的不只是如何去編譯程序這樣的理論知識,相信更重要的是一種如何“自動計算”的思路。通過對相關編譯問題的具體分析,讓我體會最深的是一種“自動計算”的思想,同時完成編譯試驗后,更是感到了一種“自動計算”的快樂。”然而我明白自己雖然對編譯有了一定的了解,我懂得了文法的分析,學會了構造確定和非確定有限自動機,學會了LL(1)文法和LR(0)文法等,但是并沒有完全掌握,對于這些知識點的實質性和其他方面,更是認識不深。作為一名學習計算機科學與技術的學生,我明白編譯原理是軟件工程的基礎,課程的結束并不意味著學習的結束,只有通過以后的學習,才能更深入地了解編譯原理。第二篇:編譯原理語法分析實驗報告
第三篇:編譯原理--實驗報告(小編推薦)
第四篇:《編譯原理》課程(詞法分析)實驗報告
第五篇:編譯原理 學習心得