第一篇:編譯原理試題(2009-2010-1)
《編譯原理》試題A
1.名詞解釋
短語
LL(1)文法 語法分析
無環路有向圖(DAG)語法制導翻譯
2. Pascal語言無符號數的正規定義如下:
num ? digit+(.digit+)?(E(+|-)? digit+)? 其中digit表示數字,用狀態轉換圖表示接受無符號數的確定有限自動機。
3.下面兩個文法中哪一個不是LR(1)文法?對非LR(1)的那個文法。給出那個有移進-歸約沖突的規范的LR(1)項目集。
S ? aAc
S ? aAc
A ? bbA | b
A ? bAb | b
4.構造下面文法的LL(1)分析表。
D ? TL T ? int | real L ? id R R ? , id R | ?
5. C語言是一種類型語言,但它不是強類型語言,因為編譯時的類型檢查不能保證所接受的程序沒有運行時的類型錯誤。例如,編譯時的類型檢查一般不能保證運行時沒有數組越界。請你再舉一個這樣的例子說明C語言不是強類型語言。
6.把表達式
-(a+b)*(c+d)+(a+b+c)翻譯成三元式。
7.為下面文法添加語義規則(或叫動作子程序),輸出S?產生的二進制數的值,如輸入是101時,輸出5。
S? ? S
S ? S B | B
B ? 0 | 1
8.一個C語言的函數如下:
func(c,l)char c;long l;{
func(c,l);}
在X86/Linux機器上編譯生成的匯編代碼如下:
.file “parameter.c”.version “01.01” gcc2_compiled.:.text
.align 4.globl func
.type func,@function func:
pushl %ebp
—— 將老的基地址指針壓棧
movl %esp,%ebp —— 將當前棧頂指針作為基地址指針
subl $4,%esp —— 分配空間
movl 8(%ebp),%eax
movb %al,-1(%ebp)
movl 12(%ebp),%eax
pushl %eax
movsbl-1(%ebp),%eax
pushl %eax
call func
addl $8,%esp.L1:
leave —— 和下一條指令一起完成恢復老的基地址指針,將棧頂
ret —— 指針恢復到調用前參數壓棧后的位置,并返回調用者
.Lfe1:.size func,.Lfe1-func.ident “GCC:(GNU)egcs-2.91.66 19990314/Linux(egcs-1.1.2 release)”(a)請指出對應源程序第5行的函數調用func(c,l)的匯編指令是哪幾條。
(b)請說明字符型參數和長整型參數在參數傳遞和存儲分配方面有什么區別。(小于長整型size的整型參數的處理方式和字符型參數的處理方式是一樣的。)
9.程序的文法如下:
P ? D D ? D;D | id : T | proc id;D;S
(1)寫一個語法制導定義,打印該程序一共聲明了多少個id。
(2)寫一個翻譯方案,打印該程序每個變量id的嵌套深度。
《編譯原理》試題B
1.名詞解釋
句柄
LR(1)文法
無環路有向圖(DAG)語法制導翻譯 局部優化
2.某操作系統下合法的文件名為
device:name.extension 其中第一部分(device:)和第三部分(.extension)可缺省,device, name和extension都是字母串,長度不限,但至少為1,畫出識別這種文件名的確定有限自動機。
3.下面兩個文法中哪一個不是LR(1)文法?對非LR(1)的那個文法。給出那個有移進-歸約沖突的規范的LR(1)項目集。
S ? aAc
S ? aAc
A ? bbA | b
A ? bAb | b
4.程序的文法如下:
P ? D D ? D;D | id : T | proc id;D;S
(1)寫一個語法制導定義,打印該程序一共聲明了多少個id。
(2)寫一個翻譯方案,打印該程序每個變量id的嵌套深度。
5.在PASCAL語言中,簡單類型的變量的聲明例舉如下:
m, n : integer p, q, r : real 為這樣的聲明寫一個LR(1)文法(為簡單起見,變量標識符都用id表示),并根據你的文法寫一個語法制導定義(或叫做為你的文法加上語義動作),它將變量的類型填入符號表。
6.下面程序在SUN工作站上運行時陷入死循環,試說明原因。如果將第8行的long *p改成short *p,并且將第23行long k 改成short k后,loop中的循環體執行一次便停止了。試說明原因。
main(){ addr();loop();}
long *p;loop(){ long i,j;
j=0;for(i=0;i<10;i++){
(*p)--;
j++;} }
addr(){ long k;
k=0;p=&k;}
7.一個C語言函數如下:
main(){ int i,j,k;i=5;j=1;while(j<100){ k=i+1;j=j+k;} } 經優化編譯后,生成的代碼如下:
.file “optimize.c” gcc2_compiled.: ___gnu_compiled_c:.text.align 2.globl _func.type _func,@function _func: pushl %ebp movl %esp,%ebp movl $1,%eax movl $6,%edx.align 2,0x90 L4: addl %edx,%eax cmpl $99,%eax jle L4 leave ret Lfe1:.size _func,Lfe1-_func 試說明編譯器對這個程序作了哪些種類的優化(只需要說復寫傳播、刪除公共子表達式等,不需要說怎樣完成這些優化的)。
8.為下面文法添加語義規則(或叫動作子程序),輸出S?產生的二進制數的值,如輸入是101時,輸出5。
S? ? S
S ? S B | B
B ? 0 | 1
9.構造下面文法的LL(1)分析表。
D ? TL T ? int | real L ? id R R ? , id R | ?
第二篇:編譯原理 學習心得
國際學院 0802 楊良燕 200819100227
《編譯原理》課程學習心得
《編譯原理》是計算機專業的一門重要課程,正如教材
第一章的引論所述,“編譯程序是現代計算機系統的基本組成部分之一”?!耙粋€編譯程序就是一個語言翻譯程序,語言翻譯程序把一種語言(源語言)書寫的程序翻譯成另一種語言(目標語言)的等價程序”。
通過這一學期的學習,我覺得編譯原理是一門理論性很強的課程,從文法和語言的概念到LL(1)文法和LR(0)文法的分析,幾乎都是對具體問題的抽象。因而,我們需要更多的時間來理解、掌握相關的知識,當然在這一過程中也存在很多問題,比如我們后期學習具體文法的分析方法時,對于文法的概念不夠清晰,影響了上課的效率,知道老師再次給我們講解了文法等基礎的知識點,我們才慢慢掌握后面所學的LL(1)文法等,也發現了知識點之間的關聯。此外,這門課程的課時被安排得很少,一周只有一次,這樣很不利于我們對這門重要課程的理解和掌握。但是我覺得我們很幸運,因為老師在有限的課程中盡量將知識點以比較容易接受的方式給我們講解,教我們用簡單的方法理解記憶不同的知識,對于我們提出的問題,無論課上或是課外,老師一直是不厭其煩,甚至利用課余時間為我們講解重要的難題。
編譯原理這門課程不僅僅在于其本身的理論價值,更在于為我們解決問題提供的思維方式和方法。從LL(1)到LR(0),問題不斷被解決的同時,又有一個個新的問題提了出來。對計算機語言世界的知識積累,像滾雪球一樣越滾越大。這個逐漸遞進,逐漸解決問題的過程對我來說是收獲很大的。整個過程好像踏著前人研究編譯理論的路線,不斷感覺他們遇到的問題,更重要的是他們解決問題的思路。編譯原理的課程帶給我的不只是如何去編譯程序這樣的理論知識,相信更重要的是一種如何“自動計算”的思路。通過對相關編譯問題的具體分析,讓我體會最深的是一種“自動計算”的思想,同時完成編譯試驗后,更是感到了一種“自動計算”的快樂?!比欢颐靼鬃约弘m然對編譯有了一定的了解,我懂得了文法的分析,學會了構造確定和非確定有限自動機,學會了LL(1)文法和LR(0)文法等,但是并沒有完全掌握,對于這些知識點的實質性和其他方面,更是認識不深。作為一名學習計算機科學與技術的學生,我明白編譯原理是軟件工程的基礎,課程的結束并不意味著學習的結束,只有通過以后的學習,才能更深入地了解編譯原理。
第三篇:編譯原理實驗報告
編譯原理實驗報告
報告完成日期 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.輸出語法樹 三、三地址碼生成器 算法的基本思想: 我們增加了聲明變量類型、類型賦值判定和聲明的變量被引用時作用域的判斷。從而使得我們的實驗結果呈現的更加清晰和易懂。 在報錯的時候,我們會呈現類型、作用域和賦值三種的問題的報錯信息。 流程圖: 算法展示: 四、實驗體會 這次實驗其實總的來說是讓我們更加清晰的理解到了我們所學的內容。有時候我們上課聽講,課下復習寫作業的時候,其實看似掌握了所學內容,但實際上并沒有親身體會的操作很難讓我們深刻的理解其中的相關意義。通過這次實驗,我們能夠從根源處了解到了我們所學的內容,并且基于我們理解之后的輸出。比如詞法分析不能采用空格來區分單詞,因為存在加減乘除等運算符和分隔符,使用空格來區分可能會造成錯誤的分解。又比如我們再在程序設計中,常常體會到效率的重要性。影響詞法分析的效率的主要因素是各個狀態的分支如何規劃。如果每個進來的單詞都能在最短的時間和最少的匹配次數內找到其入口,則效率將得到很大程度上的提高。所以由此我們產生了聲明變量類型、賦值和作用域的想法,將其放在最后來進行判斷,這樣可以提高整體的執行效率。 另外,這次小組成員彼此不在一個班級,這樣從某一方面來說,也加強了我們互相快速熟識并團結協作的能力,有了這種體驗,我想我們在今后的生活中,面對這種情況的時候,將會變得更加有經驗。 五、源程序 詞法分析器: 輸入結果: 輸出結果: 語義分析結果: 輸入: 第二組數據的輸入: 輸出: 三地址碼的輸入: 第二組數據的輸入: 輸出: 課 程 設 計 報 告 設計題目:一個簡單文法的編譯器前端的設計與實現 班 級: 計算機1206 組長學號:201239 組長姓名:閆智宣 指導教師:李曉華 設計時間:2014年12月 [在此處鍵入] 設計分工 組長學號及姓名: 20123974 閆智宣 分工: 語法分析,四元式生成,目標代碼優化及生成 組員1學號及姓名:20123977 廖峭 分工: 詞法分析,錯誤處理 組員2學號及姓名:20123959 郭天龍 分工: 符號表生成,語義動作插入,操作界面[在此處鍵入] 摘要 編譯原理課程設計是通過C語言編譯器相關子系統的設計,進一步加深對編譯器構造的理解;第一部分詞法分析,設計各單詞的狀態轉換圖,并為不同的單詞設計種別碼,制作掃描器識別一個個單詞,返回值為識別碼的序號,返回Token序列。將詞法分析器設計成供語法分析器調用的子程序。詞法分析器具備預處理功能。將不翻譯的注釋等符號先濾掉,只保留要翻譯的符號串,即要求設計一個供詞法分析調用的預處理子程序;第二部分,語法分析,用遞歸下降法,實現對表達式、各種說明語句、控制語句進行語法分析。若語法正確,則用語法制導翻譯法進行語義翻譯;生成并打印出語法樹;若語法錯誤,要求指出出錯性質和出錯位置(行號)。 我們還做了附加功能,即編譯后端,有中間代碼優化,生成目標代碼匯編語言。通過此次課程設計,提高了我們的獨立分析問題、解決問題的能力,以及系統軟件設計的能力; 提高程序設計能力、程序調試能力,團結協作能力 關鍵詞:詞法分析,語法分析,四元式生成,錯誤處理,符號表生成,語義動作插入,中間代碼優化,生成目標代碼 [在此處鍵入] 目錄 摘要 1.概述 2.課程設計任務及要求 2.1 設計任務 2.2 設計要求 3.算法及數據結構 3.1算法的總體思想(流程) 3.2 詞法分析模塊 3.2.1 功能 3.2.2 數據結構 3.2.3 算法 3.3 語法分析模塊 3.3.1功能 3.3.2 數據結構 3.3.3算法 3.4 符號表模塊 3.4.1功能 3.4.2 數據結構 3.4.3算法 3.5 四元式模塊 3.5.1功能 [在此處鍵入] 3.5.2 數據結構 3.5.3算法 3.6 語義動作分析模塊 3.6.1功能 3.6.2 數據結構 3.6.3算法 3.7 錯誤處理模塊 3.7.1功能 3.7.2 數據結構 3.7.3算法 3.8 目標代碼模塊 3.8.1功能 3.8.2 數據結構 3.8.3算法 4.程序設計與實現 4.1 程序流程圖 4.2 程序說明 4.3 實驗結果 5.結論 6.參考文獻。7.收獲、體會和建議。 [在此處鍵入] 1.概述 編譯器是將C語言翻譯為匯編語言代碼的計算機程序。編譯器將源程序(source language)編寫的程序作為輸入,翻譯產生目標語言(target language)機器代碼的等價程序。通常地,源程序為高級語言(high-level language),C語言程序,而目標則是 機器語言的目標代碼(object code),也就是可以在計算機硬件中運行的機器代碼軟件程序。這一過程可以表示為: 源程序→編譯器 →目標機器代碼程序 2.課程設計任務及要求 2.1設計任務 學生在學習《編譯原理》課程過程中,結合各章節的構造編譯程序的基本理論,要求用C#語言描述及上機調試,實現一個 C編譯程序(包括詞法分析,語法分析等重要子程序),使學生將理論與實際應用結合起來,受到軟件設計等開發過程的全面訓練,從而提高學生軟件開發的能力。 2.2設計要求 要求: (1)設計詞法分析器 設計各單詞的狀態轉換圖,并為不同的單詞設計種別碼。將詞法分析器設計成供語法分析器調用的子程序。功能包括: a.具備預處理功能。將不翻譯的注釋等符號先濾掉,只保留要翻譯的符號串,即要求設計一個供詞法分析調用的預處理子程序; b.能夠拼出語言中的各個單詞; [在此處鍵入] c.返回(種別碼,屬性值,行號)。 (2)語法分析 要求用學習過的自底向上或自頂向下的分析方法等,實現對表達式、各種說明語句、控制語句進行語法分析。若語法正確,則用語法制導翻譯法進行語義翻譯;生成并打印出語法樹;若語法錯誤,要求指出出錯性質和出錯位置(行號)。 3.算法及數據結構 3.1算法的總體思想(流程) 本節主要分析程序的代碼結構和代碼工程文件的劃分。(程序由幾個類組成: Token類和Variable類SymbolTable類ObjectCode類Lexical類Grammar類Four_Yuan類Action類ErrorItem類,分別為詞法分析和語法分析類。工程分為幾個文件:Form1.cs,Token.cs,Variable.cs,SymbolTable.cs,ObjectCode.cs,Lexical.cs,Grammar.cs,Four_Yuan,cs,Action.cs,ErrorItem.cs分別對應Token類和Variable類SymbolTable類ObjectCode類Lexical類Grammar類Four_Yuan類Action類ErrorItem類的聲明和實現文件)。本程序采用C#語言以面向對象的思想編寫,程序分為幾部分:詞法分析(Lexical),語法分析(Grammer),目標代碼生成(ObjectCode)。Lexical類主要的工作是詞法分析獲取Token。Grammer類的主要工作是根據Lexical類詞法分析之后的Token進行語法分析,生成語法樹,最后并輸出語法樹。在處理過程中,Token類的對象作為Lexical類的一個成員變量,配合Grammer類進行語法分析。 工程文件總體上是按照九個類的格局分為十個文件,分別是九個類的聲明文件和實現文件。十個文件為Form1.cs,Token.cs,Variable.cs,SymbolTable.cs,ObjectCode.cs,Lexical.cs,Grammar.cs,Four_Yuan,cs,Action.cs,ErrorItem.cs,他們分別是Lexical類聲明文件、Lexical類實現文件、Grammer類聲明文件、Grammer類實現文件。[在此處鍵入] 程序流程 在程序中,Lexical類的對象(Token)作為Grammer類中的一個成員變量,配合Grammer類進行語法分析。它們的關系是這樣的:Grammer類的一個成員變量temp首先對源程序刪除注釋,然后進行詞法分析獲取所有Token,并將獲取的Token存儲在Token對象的tokenList(List類型)中。然后Grammer類的語法分析程序就根據tokenList中的Token進行語法分析,生成語法樹,最后打印語法樹。同時,這也是程序的流程。[在此處鍵入] 3.2 詞法分析模塊 3.2.1功能 Lexical類主要的工作是詞法分析獲取Token序列。 3.2.2數據結構 詞法分析階段的代碼被封裝成一個類——Lexical,Token中主要是Lexical類的聲明代碼,Lexical.cs中主要是Lexical類的實現代碼。Lexical類對外提供的函數主要有: static public int RecogId(string str, int i),static public int RecogDig(string str,int i),static public int RecogOperator(string str, int i),static public int RecogBound(string str, int i),以上幾個函數構成了詞法分析的骨架,在Lexical類中還有其他成員變量和函數,主要作為這三個函數處理過程的中間步驟,為這三個函數服務。Lexical類的代碼結構和主要的成員變量和函數及其含義如下圖所示: 3.2.3算法 算法的基本任務是從字符串表示的源程序中識別出具有獨立意義的單詞符號,其基本思想是[在此處鍵入] 根據掃描到單詞符號的第一個字符的種類,拼出相應的單詞符號。 主程序示意圖: 主程序示意圖如圖3-1所示。 ⑴ 關鍵字表的初值。 關鍵字作為特殊標識符處理,把它們預先安排在一張表格中(稱為關鍵字表),當掃描程序識別出標識符時,查關鍵字表。如能查到匹配的單詞,則該單詞為關鍵字,否則為一般標識符。 (2)程序中需要用到的主要變量為type和number 掃描子程序的算法思想: 首先設置3個變量: [在此處鍵入] ①token用來存放構成單詞符號的字符串; ②number用來整型單詞; ③type用來存放單詞符號的種別碼。 Token定義 Token定義: Token類型(TokenType): 3.3 語法分析模塊 3.3.1功能 語法分析是編譯過程的一個邏輯階段。語法分析的功能是在詞法分析的基礎上將單詞序列組合成各類語法短語,如“程序”,“語句”,“表達式”等等.語法分析程序判斷源程序在結構上是否正確.源程序的結構由上下文無關文法描述.3.3.2 數據結構 下圖為實現語法分析的類Grammar,屬性與方法的作用都已說明 在此處鍵入] 3.3.3算法 1.文法 下面終結符與非終結符意義 B程序開始 Z 數據類型,如int,char,float等 V 標識符 S 語句 P 語句塊 E 加減算術表達式 D 逗號表達式 T 乘除算術表達式 C 關系表達式 L 邏輯表達式 Q 標識符或圓括號 e 表示空 i 表示標識符 a)函數文法 B----ZV()S [ [在此處鍵入] b)語句塊文法 P----SP|e S----{P} c)語句文法 表達式語句文法 S----V=E goto語句文法 S----i:S S----goto i if語句文法 S----if(E)S[else S] while語句文法 S----while(E)S 聲明語句文法 S----ZVD D----,VD|=ED|e d)表達式文法 E----T|E+T|E-T T----F|T*F|T/F C----C|C L----Q|L&&Q|L||Q Q----i|(E)|!Q 2.遞歸下降程序流程圖 對應于每個文法編寫如下遞歸下降子程序 主程序(B)[在此處鍵入] [在此處鍵入] 3.4 符號表模塊 3.4.1功能 進行符號表的儲存,添加,更新,查找,保存標識符活躍信息以及輸出。3.4.2 數據結構 在此處鍵入] 3.4.3算法 3.5 四元式模塊 3.5.1功能 四元式為中間代碼,編譯程序進行完語義分析后,先生成中間代碼作為過渡,此時中間代碼與目標代碼已經比較相似 3.5.2 數據結構 [ 在此處鍵入] 3.5.3算法 3.6語義動作分析模塊 3.6.1功能 在語法分析中嵌入相應的語義動作,生成四元式 3.6.2 數據結構 [ [在此處鍵入] 3.6.3算法 GEQ(+)(-)(*)(/) (+,i1,i2,t)PUSH(i)ASSI(=) (=,t,_,POP)LABER(i) (lb,_,_,i)GOTO(i) (gt,_,_,i)IF(if) (if,a,_,_)EL(el) (el,_,_,_)IE(ie) (ie,_,_,_)WH() (wh,_,_,_)DO() (do,a,_,_)WE(we) (we,_,_,_) 3.7 錯誤處理模塊 3.7.1功能 保存運行時發現的錯誤,儲存行號已經詳細信息并輸出。 3.7.2 數據結構 3.7.3算法 [在此處鍵入] public static void AddErrorMessage(int lineno,string content)函數用作在發現錯誤時保存錯誤信息以及行號。 public static string PrintErrorList()把所有發現的錯誤格式化后統一輸出。 錯誤信息在語法分析,語義分析,符號表檢錯中添加。3.8 目標代碼模塊 3.8.1功能 目標代碼生成把優化后的中間代碼變換成目標代碼,此處的目標代碼為匯編代碼,采用單寄存器生成目標代碼 3.8.2 數據結構[在此處鍵入] 3.8.3算法 對于一個基本塊有如下流程圖 W:操作符,B:第一操作數,C:第二操作數,R:寄存器 5.結論 網上找一段話抄上 [在此處鍵入] 6.測試 測試打開文件 測試保存文件 如果沒打開文件,直接敲代碼,點保存時會彈出另存為窗口[在此處鍵入] 測試錯誤檢測,程序缺少main函數的類型,錯誤列表中顯示第一行函數缺少錯誤類型。 測試錯誤檢測,程序缺少分號,錯誤列表中顯示該行缺少語句結束標志';' 單擊錯誤列表,會自動選定錯誤行 編譯成功,生成并顯示token串、符號表、四元式與目標代碼 [在此處鍵入] 測試if與while語句,而且while嵌套在if當中 測試goto語句,結果正確。[在此處鍵入] 測試優化,輸入課件中的代碼,結果與課件一樣 6.參考文獻。 1、陳火旺.《程序設計語言編譯原理》(第3版).北京:國防工業出版社.2000.2、美 Alfred V.Aho Ravi Sethi Jeffrey D.Ullman著.李建中,姜守旭譯.《編譯原理》.24 [在此處鍵入] 北京:機械工業出版社.2003.3、美 Kenneth C.Louden著.馮博琴等譯.《編譯原理及實踐》.北京:機械工業出版社.2002.4、金成植著.《編譯程序構造原理和實現技術》.北京:高等教育出版社.2002.7.收獲、體會和建議。 直接拷貝好歹也檢查一下錯誤 對于編譯原理的這次課程設計,自己經歷了從剛開始的不懂?明白任務的要求和內容?理論知識的了解?開始著手寫代碼?完成基本功能?根據DFA及自頂向下等理論修改完善代碼等這些過程。 自己著手寫詞法分析的時候還不清楚詞法分析的任務內容,還不知道詞法分析的結果是什么,詞法分析出錯的情況和類型有哪些,也總是將詞法分析和語法分析混在一起,不明白哪些錯誤在詞法分析中報,哪些錯誤在語法分析中判斷,后來經過查書、網上資料、請教同學等途徑逐步清晰了詞法分析的工作內容是從源代碼文件中獲取出Token,供語法分析使用。在充分了解了語法分析需要哪些信息時,我才真正了解了詞法分析的工作內容和目標,才知道詞法分析需要完成哪些任務獲取到哪些信息。充分了解了詞法分析的任務之后,就開始理論知識的學習。經過揣摩書上的例子,自己理解和掌握了怎么設計過濾注釋和分析程序中Token的DFA,于是開始根據設計好的DFA進行編碼,最后經過調試已經可以正確地完成詞法階段的任務了。這只是詞法分析的原始代碼,在之后還進行了兩次徹底的改動。雖然之前寫的詞法分析的代碼已經完成了詞法分析的需求,也是根據DFA的原理編寫的,但是在代碼結構上卻難以體現,在對書上的根據已知DFA寫代碼的例子進行了詳細的研究之后,發現自己的代碼并沒有像書上那樣完全按照所依據的DFA各狀態轉移的關系進行編寫,所以對代碼進行了重寫,像書上一樣嚴格按照狀態之間轉移的方式進行編寫,將狀態劃分成11個狀態,狀態分別按1~11進行標注,程序也按照DFA來編寫,也實現了詞法分析的功能。再后來寫報告的時候,發現分析出Token的那個DFA并不是最簡的,有很多多余的狀態,完全可以用一個flag標志來標識,從而簡化代碼結構,于是又重寫了一次詞法分析函數scan()的代碼,將狀態縮減為5個,且不再用1-5來表示,而是像書上那樣分別取了名字(START、INNUM、INID、INDBSYM、DONE),同時為了簡化代碼將輸出Token到文件的部分從scan()中剝離開來,而在Lexical類中加了一個printToken()的函數,使scan()函數邏輯更加清晰,使讀者能夠容易地將代碼與DFA進行查看比照。 在寫語法分析的時候,已經對編譯器的語法分析的內容有了一定的了解,所以直接進行了理論的學習。首先自己對遞歸向下分析法進行了學習,將書上的幾個遞歸向下分析的偽代碼看過之后,自己對遞歸向下的分析方法的原理有了初步的認識,大概知道了根據文法怎么分析,但是對于如何編寫代碼卻還在此處鍵入] 是難以下手,于是就對照TINY語言的文法看了幾遍書后面的TINY語言的遞歸向下分析的語法分析程序,這樣就基本知道了C-語言的語法分析程序怎么寫。由于C-語言給出的文法有左遞歸存在,于是自己將存在左遞歸的文法改寫成EBNF的形式,并據此進行代碼編寫。由于在編寫代碼的過程中需要確定分析是否正確或選擇多個文法中的某一個文法進行分析,有時必須探測需要的或下一個Token的類型,在這種情況下需要求First集合,在推導中若存在empty,又需要求Follow集合,所以這樣又需要我了解First集合和Follow集合,自己在程序中也根據求出的First集合和Follow集合進行判斷,以確定程序的走向。在編寫過程中,還有一類問題,就是存在公共左因子,如文法expression→ var = expression | simple-expression,左因子為ID,在分析過程中,由于已經取出了一個ID的Token,且生成了一個IdK的節點,但是在當前狀態無法確定是哪一個推導,然而IdK節點已經生成,又無法回退,并且是使用自頂向下的分析方法,已經生成的IdK在程序上方無法使用,自己通過查閱資料等途徑的學習確定了在這種情形下的處理方式:將已經生成的IdK節點傳到下方的處理程序,所以TreeNode * simple_expression(TreeNode * k)、TreeNode * additive_expression(TreeNode * k)等函數都被設計成有節點類型參數的函數,目的就是將已經生成的節點傳到下面的分析函數中去。 通過這次的編譯原理課程的學習和實踐,自己獲益良多。首先最基本的成果是完成了課程設計的任務,實現了編譯器的詞法分析和語法分析階段的功能,詞法分析主要能過濾注釋、分析出語法分析階段需要的Token并滿足語法階段的所有要求,能夠判別詞法分析階段是否出錯和出錯類型和位置。語法分析主要能根據遞歸向下的分析思想和C-文法對詞法分析獲取的Token進行語法分析,能夠構造出語法樹,能夠判別語法分析過程中是否出錯以及出錯位置和錯誤類型。 由于在編寫程序過程中,涉及到了正則表達式、DFA、提取公共左因子、消除左遞歸、EBNF、求First集合和Follow集合、遞歸向下分析方法以及編程語言方面的知識,所以,通過本次的課程設計的實踐,使得自己對編譯原理這門課的許多知識點有了更加深刻和具體的理解,而不再只限制于做題。此外,對以前那些已掌握的知識有了溫習和動手鍛煉的機會。如:以前在編譯原理課上雖然知道First集合和Follow集合怎么求的,卻不知道First集合和Follow集合到底是干什么的,通過編寫程序自己明白了他們的實際作用,使得自己不僅知其然還知其所以然,從而使得自己加深了對知識點的理解和掌握。由于以前編寫代碼都是使用JAVA語言,所以C/C++很多內容都忘記了,通過本次的實踐,自己又重新拾起了以前的知識。此外,由于在做報告的時候,需要描繪DFA和程序流程圖,使得自己初步掌握了使用visio和word畫圖的能力。此外,對于文檔的編寫和美化自己也獲得了許多有用的經驗。[ 編譯原理教學大綱 一、課程的性質、地位 本課程是計算機專業的重要專業課之一,是一門理論性和實踐性較強的課程。主要介紹程序設計語言編譯程序構造的基本原理和基本實現方法。本課程主要講授形式語言、有限自動機、自上而下和自下而上的語法分析、LR分析方法、屬性文法和語法制導翻譯、語義分析的代碼產生、存儲器的動態分配與管理、符號表的組織與管理、優化問題、代碼生成等內容。通過本課程學習,使學生對編譯的基本概念、原理和方法有完整的和清楚的理解,并能正確地、熟練地運用。 二、課程的目的、任務和要求 該課程的目的是讓學生掌握程序設計語言編譯程序構造的一般原理、基本設計方法、主要實現技術和一些自動構造工具。通過本課程的學習,使學生較好地掌握編譯原理的基本原理和基本技術、編譯原理中涉及的基本算法、基本結構和主要實現技術,從而讓學生了解將高級程序設計語言源程序翻譯成計算機能處理的目標代碼語言的整個過程,基本掌握計算機系統軟件之一 編譯程序的構造原理及相關技術,同時,還可提高學生計算機專業素質,培養學生的抽象思維能力。通過學習,學生可基本掌握計算機系統軟件之一 編譯程序的構造原理及相關技術,同時,還可提高學生計算機專業素質,培養學生的抽象思維能力。 三、與其它課程的關系 要求學生具有較好的計算機基礎知識,對計算機的工作原理有一定了解,前導課程包括:高等數學、線性代數、計算機原理、離散數學、高級程序設計語言、數據結構等課程。 四、課程內容(建議理論課時:62 上機課時:18)第一章 編譯程序概論 1、教學目的及要求: 本章介紹編譯程序在計算機科學中的地位和作用,介紹編譯技術的發展歷史,講解編譯程序、解釋程序的基本概念,概述編譯過程,介紹編譯程序的邏輯結構和編譯程序的組織形式。要求理解編譯程序、解釋程序和遍的基本概念;掌握編譯過程各階段的任務和編譯程序邏輯結構及其各部分的基本功能。 2、教學內容: 編譯程序,編譯過程概述,編譯程序的結構,編譯程序與程序設計環境,編譯程序生成,學習構造編譯程序。 3、教學重點: 重點:編譯程序工作的基本過程及其各階段的基本任務,編譯程序總框。 4、教學難點: 編譯的遍。 5、教學時間分配及進度安排: 建議本章教學時數2學時。 6、章節內容 1、什么是編譯程序 2、編譯過程概述 3、編譯程序的結構 4、編譯技術和軟件工具 第二章 文法和語言 1、教學目的及要求: 本章是編譯原理課程的理論基礎,要求理解文法、語言、規范推導、規范歸約和短語、簡單短語、句炳的基本概念;掌握語言的求解方法、文法的二義性與遞歸性的判斷方法及句型的分析方法。 2、教學內容: 形式語言的基本概念,包括符號串的基本概念和術語、文法和語言的形式定義、句型分析、文法和語言的Chomsky分類,二義性。 3、教學重點: 上下文無關文法,語言定義。 4、教學難點: 推導,文法與語言的相互轉換。 5、教學時間分配及進度安排: 建議本章教學時數5學時。 6、章節內容 1、文法的直觀概念 2、符號和符號串 3、文法和語言的形式定義 4、文法的類型 5、語法樹和二義性 6、句型的分析 7、文法中的實用限制 第三章 詞法分析 1、教學目的及要求: 本章介紹編譯程序的第一個階段詞法分析的設計原理和設計方法,要求掌握正則文法、狀態轉換圖、DFA、NFA、正規式和正規集的基本概念和詞法分析設計與編寫。 2、教學內容: 詞法分析的設計原理和設計方法,源程序輸入與詞法分析程序輸出、正則文法及其狀態轉換圖、確定的有限自動機(DFA)不確定的有限自動機(NFA)正則表達式與正規集。 3、教學重點: 重點:詞法分析器的任務與設計,狀態轉換圖。 4、教學難點: 正則文法、正規集、DFA、NFA的相互轉化。 5、教學時間分配及進度安排: 建議本章教學時數8學時。 6、章節內容 1、詞法分析程序的設計 2、單詞的描述工具 3、有窮自動機 4、正規式和有窮自動機的等價性 5、正規文法和有窮自動機間的轉換 第四章 語法分析—自上而下分析 1、教學目的及要求: 本章介紹編譯程序的第二個階段語法分析的設計方法和實現原理,包括自上而下分析的無回朔的遞歸下降分析、LL(1)分析法。要求理解遞歸下降分析、LL(1)文法的基本概念;掌握無回朔的遞歸下降分析的設計和實現、LL(1)分析表的構造與分析方法。 2、教學內容: 語法分析器的功能,自上而下語法分析(遞歸下降分析法,預測分析程序),LL(1)分析法,遞歸下降分析程序構造,預測分析程序。 3、教學重點: 遞歸下降子程序,預測分析表構造,LL(1)文法。 4、教學難點: LL(1)文法預測分析表構造。 5、教學時間分配及進度安排: 建議本章教學時數5學時。 6、章節內容 1、確定的自頂向下分析思想 2、LL(1)文法的判別 3、某些非LL(1)文法到LL(1)文法的等價變換 4、不確定的自頂向下分析思想 5、確定的自頂向下分析方法 第五章 語法分析—自下而上分析 1、教學目的及要求: 要求理解算符優先文法、最左素短語、有效項目的基本概念;掌握算符優先分析方法、LR(0)文法的判斷及LR(0)分析表的構造與分析方法、SLR(1)文法的判斷與SLR(1)分析方法和LR(1)文法的判斷與LR(1)分析方法。 2、教學內容: 自下而上語法分析(算符優先分析法),算符優先分析,LR分析器,LR(0)項目集族和LR(0)分析表的構造,SLR分析表的構造,規范LR分析表的構造。 3、教學重點: 歸約,算符優先表構造,LR分析法。 4、教學難點: 歸約,LR分析法。 5、教學時間分配及進度安排: 建議本章教學時數12學時。 6、章節內容 1、自底向上分析思想 2、算符優先分析法 3、LR分析法 第六章 屬性文法和語法制導翻譯 1、教學目的及要求: 本章介紹編譯程序的第三個階段語義分析及中間代碼生成的設計原理和實現方法,要求理解語法制導翻譯、語義動作的基本概念;掌握算數表達式和賦值語句到中間代碼的翻譯、布爾表達式和幾種控制語句的目標代碼結構分析和到四元式的語法制導翻譯;說明語句的語法制導翻譯。 2、教學內容: 語法制導翻譯的基本概念、中間代碼的形式,可執行語句和說明語句的語法制導翻譯方法。 3、教學重點: 語法制導翻譯基本思想,語法制導翻譯概述,基于屬性文法的處理方法,自下而上分析制導翻譯概述。 4、教學難點: 屬性文法的處理方法 5、教學時間分配及進度安排: 建議本章教學時數9學時。 6、章節內容 1、屬性文法 2、語法制導翻譯概論 3、中間代碼的形式 4、簡單賦值語句的翻譯 5、布爾表達式的翻譯 6、控制語句的翻譯 第七章 符號表 1、教學目的及要求: 本章介紹編譯程序的組成部分之一符號表的管理,要求掌握符號表管理的基本方法。 2、教學內容: 符號表的作用、建立、符號表欄目的組織、符號表上的操作。 3、教學重點: 符號表的作用與內容。 4、教學難點: 符號表的內容。 5、教學時間分配及進度安排: 建議本章教學時數3學時。 6、章節內容 1、符號表的作用和地位 2、符號表的主要屬性及作用 3、符號表的組織 4、符號表的管理 第八章 運行時存儲空間組織 1、教學目的及要求: 本章介紹目標程序運行時的存儲組織方式,包括靜態存儲分配和動態存儲分配。要求掌握各種存儲組織形式的基本方法。 2、教學內容: 目標程序運行時的活動,運行時存儲器的劃分,靜態存儲管理,簡單的棧式存儲分配的實現,嵌套過程語言的棧式實現,堆式動態存儲分配。 3、教學重點: 靜態分配策略和動態分配策略基本思想,嵌套過程語言棧式分配,活動記錄、運行時棧的組織。 4、教學難點: 嵌套過程語言棧式分配,活動記錄、運行時棧的組織。 5、教學時間分配及進度安排: 建議本章教學時數9學時。 6、章節內容 1、數據空間的三種不同使用方法 2、棧式存儲分配的實現 3、參數傳遞 第九章 代碼優化 1、教學目的及要求: 本章介紹優化的相關知識,要求掌握局部優化,基本塊的DAG表示及其應用,控制流分析和循環查找算法,到達定值與引用定值鏈,循環優化。 2、教學內容: 主要內容:優化概述,局部優化,基本塊的DAG表示及其應用,控制流分析和循環查找算法,到達定值與引用定值鏈,循環優化。 3、教學重點: 局部優化;DAG的構造與應用。 4、教學難點: 循環查找。 5、教學時間分配及進度安排: 建議本章教學時數6學時。 6、章節內容 1、優化技術簡介 2、局部優化 3、控制流分析和循環優化 第十章 代碼生成 1、教學目的及要求: 本章介紹編譯程序的第五階段目標代碼的生成的設計原理和實現方法,要求掌握四元式到匯編語言的目標代碼生成方法。 2、教學內容: 目標機器模型,一個簡單代碼生成器,寄存器分配,DAG目標代碼,窺孔優化。 3、教學重點: 簡單代碼生成器,寄存器分配策略。 4、教學難點: 寄存器分配策略。 5、教學時間分配及進度安排: 建議本章教學時數3學時。 6、章節內容 1、代碼生成概述 2、一個計算機模型 3、一個簡單的代碼生成器 4、代碼生成研究現狀 注:使用教材-編譯原理(第二版).張素琴,呂映芝,蔣維杜,戴桂蘭編著,清華大學出版社,2005.2。參考書: 1)編譯原理, 何炎祥, 華中理工大學出版社, 2000.10 2)編譯原理, 陳火旺等, 國防工業出版社, 2000.1 3)編譯原理, 蔣立源, 西北工業大學出版社, 1999.9第四篇:編譯原理課程設計
第五篇:編譯原理教學大綱(范文模版)