第一篇:《編譯原理》課程設計要求
《編譯原理》課程設計實施方案
課程設計的具體內容以傳至QQ群共享《編譯原理課程設計具體內容.ppt》中,由于學校沒有足夠大的機房供我們課程設計,所以課程設計采取單獨輔導形勢,同學們有任何問題,可以來我辦公室答疑。
設計報告提交要求
1提交的內容:
驗收經過測試的程序
提交設計報告。報告可以包括以下內容:
<1> 任務與目的<2> 軟件設計
a.軟件的總體結構與模塊劃分
b.關鍵算法與重要數據結構
<3> 測試例程設計與測試結果分析
<4> 總結、體會、改進建議等
2.課程設計報告的字數(包括圖表)不得少于10000字。
3. 禁止課程設計抄襲,發現原文抄襲網站或報刊內容以零分記。
4.禁止課程設計雷同,發現雷同以零分記。
提交方式
1.要求提交《課程設計報告》打印稿。
2.A4紙張排版,格式參考學年論文規范。
3.在提交論文時填寫課程設計封面,詳細注明課程名稱、題目、學號、姓名、年級、專業班級等基本信息。
4.解釋程序源程序(由各班班長統一用U盤拷貝給我)。
時間要求
第19周周五前,按班為單位,各班班長負責提交,過期不再受理,不記成績。
提交地址,電氣信息樓B3-602,聯系電話:***,EMAIL:rendong5227@163.com QQ:190186735
第二篇:編譯原理課程設計要求
題目:書中任選一文法對它進行LR分析和語義分析(語言不限制)
文檔不可少的內容:
? 實現原理
? 程序流程圖
? 子函數說明或者類的說明
? 程序代碼及運行結果
? 心得體會
文檔不少于12頁,參考文獻不少于10個,最后提交源程序和文檔(檢查通過以后再打?。?,格式嚴格按照模版。
第三篇:編譯原理課程設計
課 程 設 計 報 告
設計題目:一個簡單文法的編譯器前端的設計與實現
班
級: 計算機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畫圖的能力。此外,對于文檔的編寫和美化自己也獲得了許多有用的經驗。[
第四篇:編譯原理課程設計簡介
編譯原理實踐課程
編譯原理課程是計算機專業必修的一門重要的專業基礎課程,也是計算機系統軟件中非常重要的一個分支,經過多年建設取得了豐碩的教學成果:2003年被評為“吉林大學百門精品課程”之一,2004年被評為吉林省精品課程,2006年被評為教育部—微軟精品課程。編譯原理實踐課程建設作為新世紀教學改革重點項目和編譯原理精品課程建設的一個重要組成部分,在教材建設、教學內容和教學方法的改革等方面也取得了較突出的成績,并發表了多篇學術論文。
一、實驗課程目的
編譯原理課程是計算機科學與技術專業學生的專業骨干課之一。通過學習這門課程,使學生掌握編譯程序的基本原理、方法和實現技術,使學生更好的理解程序語言的內部機制,培養學生初步掌握設計大型系統軟件的方法、技術以及設計大型軟件的能力。
編譯原理實踐性教學的設計思想是使學生透徹的理解編譯程序的原理和思想,系統全面的掌握編譯技術,使學生通過課堂學習,理解編譯原理的同時,注重學生實踐能力的培養,進一步鞏固對知識的理解,通過實際的鍛煉,掌握編譯技術,進而能夠獨立的進行編譯器的設計。
二、實驗內容及要求
編譯程序不同于一般的應用程序,是一個十分龐大和復雜的系統軟件。一般的應用程序是以數據作為操作對象,而編譯程序則是以程序作為操作對象,是一個元級處理程序,它所包含的算法和思想比較特殊,理論性較強,抽象度也較高,因而編譯原理課程一直以來都是計算機專業學生比較難于理解和掌握的一門課程。為此我們開設編譯原理實踐課程。編譯原理實踐課程的主要實踐題目有:
實驗一: 詞法分析程序開發
實驗要求: 1.掌握詞法分析程序自動生成工具LEX的使用。
2.掌握各類單詞的形式描述。
3.學會用數據中心法實現有限自動機。4.學會用直接轉向法實現有限自動機。5.獨立完成SNL語言的詞法分析器。
實驗二: 遞歸下降語法分析
實驗要求: 1.理解遞歸下降語法分析方法的主要原理。
2.理解遞歸下降分析法對文法的要求。
3.熟練掌握Predict集合的求法。
4.熟練掌握文法變換算法(消除左遞歸和消除公共前綴)。實驗三: LL(1)語法分析
實驗要求: 1.理解LL(1)分析法的主要原理。
2.理解LL(1)分析法對文法的要求。
3.熟練掌握Predict集合的求法。
4.通過編程熟練掌握LL(1)分析法的工作過程。實驗四: 符號表管理
實驗要求: 1.了解符號表在編譯過程中的重要作用。
2.掌握符號表應包含的符號的屬性信息。3.了解符號表的組織原則。4.掌握符號表的操作。
5.掌握符號表的可見性問題。
實驗五: 語義檢查
實驗要求: 1.了解語義檢查是語義分析的一個重要內容。
2.掌握語義檢查的一般內容。
3.學會在語法分析的同時進行語義檢查。4.學會將語義分析作為一遍獨立的掃描。
實驗六: 中間代碼生成
實驗要求: 1.了解中間代碼生成是為優化和移植而進行的。
2.了解幾種常見中間代碼表示形式掌握符號表應包含的符號的屬性信息。
3.會用簡單的程序實現中綴式到后綴式的轉換。4.會用棧實現復雜表達式的求值。
5.掌握常見程序結構的中間代碼結構。
6.掌握由語法樹到四元式中間代碼的轉換方法。
實驗七: 中間代碼優化
實驗要求: 1.能夠對中間代碼正確劃分基本塊。
2.理解常量表達式局部優化算法。
3.理解公共表達式局部優化算法。
4.理解循環不變式外提優化算法。實驗八: 目標程序生成
實驗要求: 1.熟練掌握虛擬機的指令系統。
2.理解并掌握指令選擇的方法。
3.理解多寄存器分配的原則和方法。
4.熟練掌握基本語句從四元式中間代碼形式到目標代碼的翻譯原理和方法。
5.獨立完成目標代碼生成程序。
三、實驗教學過程及教學手段
教學過程:
經過近三年的研究、探索與實踐,我們在編譯原理實踐課程的建設方面取得了一定成效。在吉林大學計算機學院首次開設了編譯原理實踐課程,該課程以學生實際上機實習為主,教師指導為輔,強調啟發式教學,注重學生自學能力的培養。學生在實踐課程中,通過實際動手編程,將抽象的編譯理論知識具體化和形象化,加深了對基本概念和方法的理解和運用,從而全面系統地掌握了編譯器的構造過程。
該課程采用教研室自編實踐教材《編譯程序設計與實現》(高等教育出版社)作為輔導教材,通過對教材中提供的編譯實例的透徹解析,加深了學生對編譯程序的直觀認識,提高了學生對源程序的分析和設計能力。同時,對學生學習、理解和掌握編譯原理理論課程也有很大的促進作用。在課程中,學生通過親自動手實踐,把原理性的抽象理論知識具體化和形象化,消化了課堂上、書本中難于理解的概念和方法,全面系統的掌握了編譯器的構造過程,激發了學生的學習興趣,培養了學生進行更深入學習的主動性。在教學方法上,結合多媒體課件,強調啟發式教學,培養學生的創新能力和動手實踐能力。實踐證明,這些教學方式的嘗試在實際教學中取得了良好的教學效果。
教學環境:
擁有良好的實踐教學環境,已建成3個大型網絡化、多媒體微機實驗室,共有800臺奔IV微機,32臺服務器,實驗室面積為2040平方米,完全能夠滿足教學實踐要求,通過開放式的實踐教學,收到了良好的教學效果。除實踐課程中規定的實驗之外,還設計了一些難度較大的選作實驗題目,激發學生的能動性,提高學生分析問題、解決問題的能力。教學手段:
1.多媒體輔助教學軟件-PCMCAI(Principle of Compile Multimedia CAI)在教學過程中,我們發現由于編譯原理理論性強,抽象度高,學生不易于理解。針對這一情況,我們研制了編譯原理多媒體輔助教學軟件-PCMCAI(Principle of Compile Multimedia CAI),該軟件以多媒體動畫的形式生動形象地描述了編譯器的各個階段的工作過程。借助現代化的教學手段和工具,將抽象的知識具體化,便于學生理解復雜的原理,極大地調動了學生的學習積極性,學習效果有了明顯的提高;
2.編譯實例庫
我們完成了編譯實例庫的構建,建立實例庫的目的是使學生通過編譯實例庫,可以了解和掌握不同類型語言的編譯原理和構造技術,培養學生的主動參與、自主思考和創新能力,擴大學生的知識面。通過實踐課程,我們總結和綜合了學生中優秀的設計實例,同時,廣泛的收集當前國內外最新的素材資料,對編譯實例庫不斷地進行完善。目前,實例庫已經初具規模并投入使用,為學生提供了廣泛的實踐素材和范例,在教學過程中作為一種輔助教學手段,效果良好。
3.網絡教學平臺:http://softlab.jlu.edu.cn 針對目前學生人數增多,教學資源不足,學生質量參差不齊,教學質量和效率得不到保證的情況,我們充分利用Internet,建立和實施網絡課程體系,利用Internet在信息制造、貯存和遞送方面的優勢,克服資源不足的缺點,同時也為學生提供了完全個性化的學習環境,發揮網絡教學優勢。目前我們已經開始了這方面的建設,完成了編譯原理實例庫、課件、習題庫等方面的建設,構建了網絡課程的框架體系,目前正著手網絡課程的進一步完善工作。
四、教材及課件
教材建設:
1.校內教材:《一個教學語言TINY的編譯程序教學實例分析教材》(2001年6月)。2.校內教材:《編譯程序構造原理與實例分析》(2003年2月)。3.編譯原理實踐教材:《編譯程序的設計與實現》(高等教育出版社,2004年7月)。
教學軟件:
1.多媒體輔助教學軟件-PCMCAI(Principle of Compile Multimedia CAI)。2.SNL(Small Nested Language)語言實例設計及其編譯器構造。3.編譯原理實例庫(C語言版本)。4.編譯原理實例庫(Java語言版本)。
五、相關成果
發表論文:
1.《編譯原理實踐課程設計的探索》,劉磊等,吉林大學新世紀教學改革項目研究成果----創新、改革與實踐 第一集 吉林大學出版社。2.《用遞歸下降方法實現自底向上的分析》,劉磊等,吉林大學學報(信息科學版),2004(3)。
3.《編譯原理多媒體輔助教學軟件的設計與實現》,劉磊等,吉林大學自然科學學報,2002(2)。
4.《測試語言ATLAS的實現技術》,劉磊等,儀器儀表學報,2004(4)。5.《ATLAS_MPS的設計與實現》,劉磊等,吉林大學學報,2004(4)。6.《編譯原理實踐課程教學方法研究》,張晶等,全國首屆計算機程序設計類課程教學研討會,2005(9)。7.《“編譯原理”課程建設研究》,劉磊等,計算機教育,2006(6)。獲得獎勵:
1.2004年,《編譯原理實踐課程建設》,吉林大學教學成果二等獎。2.2006年,《編譯程序的設計與實現》一書獲吉林大學本科優秀教材。3.2002年,編譯原理CAI課件-PCMCAI獲被吉林省教育廳評為二等獎,并在第六屆全國多媒體教育軟件大獎賽上獲得優秀獎。
4.《編譯原理》課程先后被評為吉林大學精品課程、吉林省精品課程及教育部-微軟精品課程。
總之,經過多年的研究、探索與實踐,我們在編譯原理實踐課程的建設方面取得了一定成效。在吉林大學計算機學院首次開設了編譯原理實踐課程,該課程以學生實際上機實習為主,教師指導為輔,強調啟發式教學,注重學生自學能力的培養。學生在實踐課程中,通過實際動手編程,將抽象的編譯理論知識具體化和形象化,加深了對基本概念和方法的理解和運用,從而全面系統地掌握了編譯器的構造過程。該課程采用我們自編實踐教材《編譯程序設計與實現》作為輔導教材,通過對教材中提供的編譯實例的透徹解析,加深了學生對編譯程序的直觀認識,提高了學生對源程序的分析和設計能力。同時,對學生學習、理解和掌握編譯原理理論課程也有很大的促進作用。在教學方法上,結合多媒體課件,強調啟發式教學,培養學生的創新能力和動手實踐能力。實踐證明,這些教學方式的嘗試在實際教學中取得了良好的教學效果。
附件(獲得獎勵證書)
第五篇:《編譯原理課程設計》教學大綱
《編譯原理課程設計》教學大綱
課程名稱: 課程編號: 適用專業: 總 學 分: 總 周 時: 主 撰 人: 撰寫日期:
一、目的與任務
通過程序設計上機調試程序實現算法,學習編譯程序調試技巧和設計編譯程序的一般原則,加深對詞法分析、語法分析、語義分析和中間代碼生成等編譯階段及實用編譯系統的認識,初步掌握編譯程序構造的基本原理與技術, 從形式語言理論的角度, 進一步認識與理解程序設計語言。通過編譯程序的編寫和調試能力的訓練,激發學生進一步思考問題,培養學生的學習興趣和創新能力。并進一步培養學生的抽象思維能力,進一步鞏固《編譯原理》課程所學知識。
本次課程設計的時間為2周,目的是通過實際的題目如:詞法分析、語法分析、代碼優化等,使學生了解和掌握編譯程序的工作原理,同時培養學生用相關的程序設計語言進行程序設計,實現編譯的功能,從而提高學生的綜合能力。
二、教學基本要求
1.設計和調試過程要規范化
需求分析:將題目中要求的功能進行敘述分析,并且設計解決此問題的數據存儲結構,(有些題目已經指定了數據存儲的,按照指定的設計),設計或敘述解決此問題的算法,描述算法可以使用自然語言、偽代碼、或函數的方式。
給出實現功能的一組或多組測試數據(測試文法),程序調試后,將按照此測試數據進行測試的結果列出來。
如果程序不能正常運行或運行過程中出現了不滿足算法思想的情況,寫出出現這一情況的原因或改進行的方法。
源程序要按照寫程序的規則來編寫。要結構清晰,重點函數的重點變量,重點功能部分要加上清晰的程序注釋。
程序能夠運行,要有基本的容錯功能。盡量避免出現操作錯誤時出現死循環。2.課程設計實習報告的書寫格式
編譯原理 436105 軟件工程 2W 2012.6
審 核 人:
① 設計題目
②運行環境(軟、硬件環境)③算法設計的思想 ④算法設計分析 ⑤主要函數 ⑥源代碼 ⑦運行結果分析 ⑧收獲及體會 3.實施方式
本次課程設計分成9個題目,都有一定的工作量,涵蓋本課程內容和實際應用相關的主要技術,學生可以自由組隊選擇其中一個實現。課程設計題目見“主要內容”。
根據老師給定的9個題目進行分析設計,本次課程設計采取分組的辦法進行,3-4人為一組,要求每組學生在規定時間內獨立完成。4.答辯:課題的論述、測試及問題回答
三、課程設計內容
1、詞法分析器的構造:
人們理解一個程序,起碼是在單詞級別上來思考。同樣,在編繹一個程序時,也是在單詞級別上來分析和翻譯源程序。詞法分析是編繹的基礎,執行詞法分析的程序即為詞法分析器,它的任務是對輸入或給定的源程序,從左至右逐個字符進行掃描,產生一個個單詞符號,把作為字符串的源程序改造成單詞符號串的中間程序。設計目的與任務:
通過本課程設計教學所要求達到的目的是:對詞法分析工作流程進行總體設計和詳細設計,最終用C語言來設計一個簡單詞法分析器,實現對源程序的詞法分析功能,對輸入程序去除注釋,并以二元式形式輸出程序中所有單詞。
2、正則表達式到NFA 在編譯系統中,詞法分析階段是整個編譯系統的基礎。對于單詞的識別,有限自動機FA是一種十分有效的工具。有限自動機由其映射f是否為單值而分為確定的有限自動機DFA和非確定的有限自動機NFA。在非確定的有限自動機NFA中,由于某些狀態的轉移需從若干個可能的后續狀態中進行選擇,故一個NFA對符號串的識別就必然是一個試探的過程。這種不確定性給識別過程帶來的反復,無疑會影響到FA的工作效率。而DFA引擎在任意時刻必定處于某個確定的狀態,它搜索是無需象NFA一樣必須記錄所有的可能路徑(trace multiple possible routes through the NFA),這也是DFA運行效率高于NFA的原因。而已經證明DFA是NFA的一個特例,即對于每一個NFA M存在一個DFA M’’,使得L(M)=L(M’’)。
設計目的與任務
通過本課程設計教學所要求達到的目的是:充分理解和掌握NFA,DFA以及NFA確定化過程的相關概念和知識,編程實現對輸入的任意正規式轉換成NFA的形式輸出。
3、NFA的確定化
有限自動機理論是描述詞法規則的基本理論。一條詞法規則表示一個正規表達式(又叫正規式),而一個正規式又可化為一個DFA(確定有窮自動機),這個有限自動機可用來識別詞法規則所定義的所有單詞符號。把程序設計語言的所有詞法規則都構造出相應的有限自動機,就得到一個詞法分析器。然后,再轉換為計算機可識別的程序就能自動實現詞法的分析和檢查。在實際應用中,用NFA(不確定有窮自動機)識別詞法存在不確定和狀態的冗余,因而,就要將NFA(不確定有窮自動機)轉換為DFA(確定有窮自動機),消除了不可到達和不確定。設計目的與任務
通過本課程設計教學所要求達到的目的是:掌握從NFA到DFA的轉換,以及用子集法把NFA轉換成DFA理論,編程實現將NFA(不確定有窮自動機)轉換為DFA(確定有窮自動機)。
4、DFA的最小化
確定性有限自動機(DFA ,Deterministic Finite Automata)的最小化仍是有限自動機應用及實現方面的重要問題之一。DFA的最小化可以揭示狀態之間的內在聯系,便于其存儲實現,便于建立用DFA描述的任務模型,一些理論問題也與最小化思想有關。DFA的最小化是指,構造一個與之等價且狀態數最小的DFA,即等價最小DFA。許多文獻給出了一個最小化算法,算法的思想是,構造狀態集的一個劃分,再將這個劃分中的每個子集作為新的狀態,從而得到等價最小DFA。
DFA的最小化可以揭示狀態之間的內在聯系,便于其存儲實現,便于建立用DFA描述的任務模型,一些理論問題也與最小化思想有關。
5、語法分析之LL(1)文法
通過該課程設計了解了程序語言的自上而下的語法分析過程,提高了編程能力,能使我們了解編程語言更多的細節 設計目的與任務(1)讀入文法(2)求出first(), follow()(3)判斷是否為LL(1)文法
(4)若是,構造分析表;
(5)輸入一個字符串看是否是文法的一個句子。
6、算符優先文法
一個文法,如果它的任一產生式的右邊都不含有兩個相繼(并列)的非終結符,即不 含有如下形式的產生式的右部:
?QR?
則我們稱該文法為算符文法。
假設文法中的任意兩個終結符之間最多只有一個優先關系,則該文法稱為算符優先文法。
該課程設計按照求,(P),(P)各兩條規則,求出各非終結符的集。然后按照算符優先算法求出各終結符的算符優先關系,填寫算符優先表,并將其輸出。
7、LR(0)分析表的構造
LR分析技術是一種有效的自下而上分析技術,是一種規范歸約,其中L表示從左到右掃描輸入串,R表示構造一個最右推導的逆過程。這種方法可以適用于很大一類上下無關文法的語法分析。LR方法的基本思想是:在規范歸約過程中,一方面記住已經移進和歸約出的整個符號串,即記住“歷史”;另一方面根據所用的產生式推測未來可能碰到的輸入符號,即對未來進行“展望”。當一串貌似句柄的符號串呈現于分析棧的頂端時,我們希望能夠根據所記載的“歷史”和“展望”以及“現實”的輸入符號等三方面的材料,來確定棧頂的符號傳是否構成相對某一產生式的句柄。
LR分析器的核心部分是一張分析表。這張分析表包括兩部分,一是“動作”(ACTION)表,另一是“狀態轉換”(GOTO)表。對于一個文法,如果能用一個每步頂多向前檢查K個輸入符號的LR分析器進行分析,則這個文法就稱為LR(K)文法。本文研究的LR(0)文法即K=0時的文法。
設計目的與任務
本課程設計所設計目的與任務是:通過C語言程序實現LR(0)分析表的構造,熟練掌握LR(0)分析表的構造方法,即利用拓廣文法和構造項目集規范族的方法。了解LR(0)分析器的工作原理,并能利用LR(0)分析表對輸入串進行分析。
8、逆波蘭表達式生成算法
雖然源程序可以直接翻譯為目標語言代碼,但許多編譯程序采用了獨立于機器的、復雜性介于源語言和機器翻譯語言之間的中間語言:后綴式(逆波蘭表達式)等。這樣做的好處是:
(1)便于進行與機器無關的代碼優化工作;(2)使編譯程序改變目標機更容易;
(3)使編譯程序的結構在邏輯上更為簡單明確。以中間語言為界面,編譯前端和后端的接口更清晰。設計目的與任務
將非后綴式用來表示的算術表達式轉換為用逆波蘭式來表示的算術表達式,并能運行查看結果。
9、表達式的中間代碼生成
源程序可以直接翻譯為目標語言代碼,但是許多編譯程序卻采用了獨立于機器的、復雜性介于源語言和機器語言之間的中間語言。這樣我們可以做下面工作:
(1):便于進行與機器無關的代碼優化工作;(2):使編譯程序以改變目標機更容易;(3):使編譯程序的結構在邏輯上更為簡單明確;
而以中間語言為界面,編譯前端和后端的接口更清晰,表達式可以用四個域分別稱為OP、ORG1、ORG2及RESULT來表示。
四、時間安排
《編譯原理課程設計》安排在第三學期進行,時間2周(17-18周)。
五、組織管理
1.由院、系指派經驗豐富的專業教師擔任指導教師。
2.課程設計實行指導教師負責制,由指導教師全面負責課程設計的指導與管理工作。
六、成績考核與評定
學生課程設計結束后寫出總結報告,對設計的內容和效果進行總結,按照學生在設計期間的表現,指導老師對每位學生寫出評語和鑒定,系課程設計領導小組組織答辯,最后確定每位學生課程設計成績,課程設計成績分為優、良、中、及格和不及格五個等級。課程設計成績為平時表現30%、設計報告50%、答辯20%。評分標準:
① 優秀:目的明確,態度端正,模范遵守學校的各項紀律。工作認真,積極 主動,吃苦耐勞,能出色的完成設計任務。撰寫了高質量的總結報告。答辯準確流利。
② 良好:目的明確,態度端正,能遵守學校的各項紀律,工作比較積極主動。能較好地完成設計任務,成績較突出,表現良好;撰寫了質量比較高的實習報告。答辯較準確流利。
③ 及格:目的明確,態度基本端正,能遵守學校紀律,在督促下能開展工作 并完成一定的設計任務,無大的違紀違規現象;撰寫了實習報告。通過了答辯。
④ 不及格:實習態度端正,不能遵守實習單位的紀律,不服從領導,自由散漫,工作消極被動,不能完成實習任務,實習期間有失職、曠工、打架、酗酒等大的過失。或無實習報告,沒有通過答辯。
2.成績評定
依據上述考核內容,最后采用優(>90分)、良(80~89分)、中(70~79分)及格(60~69分)、不及格(<60分)五級記分制評定學生課程設計成績。
七、主要參考資料
教材:
《編譯原理及實踐》馮博琴等譯,機械工業出版社 教學參考書
1、《程序設計語言與編譯》龔天富、侯文永編,電子工業出版社。
2、《編譯原理》呂映芝、張素琴、蔣維杜主編,清華大學出版社,1998年
3、《編譯原理》胡倫駿、徐蘭芳、劉建農編,電子工業出版社2002年
4、《編譯原理》(第二版)蔣立源、康慕寧主編,西北工業大學出版社,2002年
5、《編譯原理習題精選》陳意云、張昱著,中國科技大學出版社,2002年
6、《編譯原理習題與解析》 伍春香著,清華大學出版社,2001年
7、《編譯原理實驗指導書》自編