第一篇:編譯原理練習(xí)答案蔣宗禮
編譯原理練習(xí)
一、對下列語言集合設(shè)計(jì)CFG,?={a,b}(1)L={anbma2n | n,m>=0}。
(2)所有非空符號串,其首尾字符相同。
(3)所有a的個數(shù)大于b的個數(shù)的符號串。
(4)由a,b組成的回文串。
二、(1)構(gòu)造一個能識別所有除以5余2的二進(jìn)制數(shù)的DFA
(2)假設(shè)有一自動售貨機(jī),接收1元、2元、3元的硬幣,出售2元和4元的商品,多投不找零,請構(gòu)造能實(shí)現(xiàn)此功能有限自動機(jī)。
三、對于文法G[S],(1)給出至少兩個理由說明它不是LL(1)文法。(2)將文法改寫為LL(1)文法,并計(jì)算改造后文法的各非終結(jié)符的First 和 Follow集合,構(gòu)造其預(yù)測分析表。
S ?bAb |bBa A ?aS| CB B ?b| BC C ? c |cC
三、對于正則表達(dá)式0*11,構(gòu)造一個SLR(1)文法G[S],給出為SLR(1)文法理由:構(gòu)造識別文法活前綴的有限自動機(jī),并構(gòu)造相應(yīng)的SLR(1)分析表。
第二篇:編譯原理 形式語言題+答案
第2章 形式語言
1.試分別構(gòu)造產(chǎn)生下列語言的文法:(1){an#bn|n≥0}∪{cn#dn|n≥0};
(2)任何不是以0打頭的所有奇整數(shù)所組成的集合。
答:(1)對應(yīng)文法為G(S)=({S,X,Y},{a,b,c,d,#}, {S→X, S→Y, X→aXb|#, Y→cYd|# },S)
(2)G(S)=({S,A,B,I,J},{0,1,2,3,4,5,6,7,8,9}, {S→J|IBJ, B→0B|IB|ε, I→J|2|4|6|8, J→1|3|5|7|9},S)
2.對于下列的文法
S→AB|c
A→bA|a
B→aSb|c
試給出句子bbaacb的最右推導(dǎo)。
答:S=>AB=>AaSb=> Aacb=>bAacb=>bbAacb=>bbaacb
3.已知文法G[S]:
S->(AS)|(b)
A->(SaA)|(a)請找出符號串(a)和(A((SaA)(b)))的短語、簡單短語和句柄。答:
因?yàn)镾 不能 ?(a), 所以(a)不是文法的句型。沒有短語、直接短語和句柄。
因?yàn)镾 ?(AS)?(A(AS))?(A((SaA)S))?(A((SaA)(b))),所以(A((SaA)(b)))是文法的句型。短語:(A((SaA)(b))),((SaA)(b)),(SaA),(b)直接短語:(SaA),(b)句柄:(SaA)S
(A
S)
(A
S)
(S a A)(b)
4.試描述由下列文法所產(chǎn)生的語言的特點(diǎn):(1)S→10S0
S→aA
A→bA
A→a(2)S→aSS
S→a
答:(1)本文法構(gòu)成的語言集為:L(G)={(10)nabma0n|n,m≥0}。(2)由L(G)={a2n-1|n≥1}可知,該語言特點(diǎn)是:產(chǎn)生的句子是奇數(shù)個a。
附加題:試證明文法
S→AB|DC
A→aA|a
B→bBc|bc
C→cC|c
D→aDb|ab 為二義性文法。
答:因?yàn)榇嬖诰渥樱篴bc,它對應(yīng)兩個最右推導(dǎo):
S ? AB ? Abc ? abc S ? DC ? Dc ? abc 所以,本文法具有二義性。
第三篇:編譯原理課程設(shè)計(jì)
課 程 設(shè) 計(jì) 報 告
設(shè)計(jì)題目:一個簡單文法的編譯器前端的設(shè)計(jì)與實(shí)現(xiàn)
班
級: 計(jì)算機(jī)1206 組長學(xué)號:201239 組長姓名:閆智宣 指導(dǎo)教師:李曉華 設(shè)計(jì)時間:2014年12月
[在此處鍵入]
設(shè)計(jì)分工
組長學(xué)號及姓名: 20123974
閆智宣
分工:
語法分析,四元式生成,目標(biāo)代碼優(yōu)化及生成 組員1學(xué)號及姓名:20123977
廖峭 分工:
詞法分析,錯誤處理 組員2學(xué)號及姓名:20123959
郭天龍
分工:
符號表生成,語義動作插入,操作界面[在此處鍵入]
摘要
編譯原理課程設(shè)計(jì)是通過C語言編譯器相關(guān)子系統(tǒng)的設(shè)計(jì),進(jìn)一步加深對編譯器構(gòu)造的理解;第一部分詞法分析,設(shè)計(jì)各單詞的狀態(tài)轉(zhuǎn)換圖,并為不同的單詞設(shè)計(jì)種別碼,制作掃描器識別一個個單詞,返回值為識別碼的序號,返回Token序列。將詞法分析器設(shè)計(jì)成供語法分析器調(diào)用的子程序。詞法分析器具備預(yù)處理功能。將不翻譯的注釋等符號先濾掉,只保留要翻譯的符號串,即要求設(shè)計(jì)一個供詞法分析調(diào)用的預(yù)處理子程序;第二部分,語法分析,用遞歸下降法,實(shí)現(xiàn)對表達(dá)式、各種說明語句、控制語句進(jìn)行語法分析。若語法正確,則用語法制導(dǎo)翻譯法進(jìn)行語義翻譯;生成并打印出語法樹;若語法錯誤,要求指出出錯性質(zhì)和出錯位置(行號)。
我們還做了附加功能,即編譯后端,有中間代碼優(yōu)化,生成目標(biāo)代碼匯編語言。通過此次課程設(shè)計(jì),提高了我們的獨(dú)立分析問題、解決問題的能力,以及系統(tǒng)軟件設(shè)計(jì)的能力; 提高程序設(shè)計(jì)能力、程序調(diào)試能力,團(tuán)結(jié)協(xié)作能力
關(guān)鍵詞:詞法分析,語法分析,四元式生成,錯誤處理,符號表生成,語義動作插入,中間代碼優(yōu)化,生成目標(biāo)代碼 [在此處鍵入]
目錄
摘要
1.概述
2.課程設(shè)計(jì)任務(wù)及要求
2.1 設(shè)計(jì)任務(wù)
2.2 設(shè)計(jì)要求
3.算法及數(shù)據(jù)結(jié)構(gòu)
3.1算法的總體思想(流程)
3.2 詞法分析模塊
3.2.1 功能
3.2.2 數(shù)據(jù)結(jié)構(gòu)
3.2.3 算法
3.3 語法分析模塊
3.3.1功能
3.3.2 數(shù)據(jù)結(jié)構(gòu)
3.3.3算法
3.4 符號表模塊
3.4.1功能
3.4.2 數(shù)據(jù)結(jié)構(gòu)
3.4.3算法
3.5 四元式模塊
3.5.1功能
[在此處鍵入]
3.5.2 數(shù)據(jù)結(jié)構(gòu)
3.5.3算法
3.6 語義動作分析模塊
3.6.1功能 3.6.2 數(shù)據(jù)結(jié)構(gòu)
3.6.3算法
3.7 錯誤處理模塊
3.7.1功能
3.7.2 數(shù)據(jù)結(jié)構(gòu)
3.7.3算法
3.8 目標(biāo)代碼模塊
3.8.1功能
3.8.2 數(shù)據(jù)結(jié)構(gòu)
3.8.3算法
4.程序設(shè)計(jì)與實(shí)現(xiàn)
4.1 程序流程圖
4.2 程序說明
4.3 實(shí)驗(yàn)結(jié)果
5.結(jié)論 6.參考文獻(xiàn)。7.收獲、體會和建議。
[在此處鍵入]
1.概述
編譯器是將C語言翻譯為匯編語言代碼的計(jì)算機(jī)程序。編譯器將源程序(source language)編寫的程序作為輸入,翻譯產(chǎn)生目標(biāo)語言(target language)機(jī)器代碼的等價程序。通常地,源程序?yàn)楦呒壵Z言(high-level language),C語言程序,而目標(biāo)則是 機(jī)器語言的目標(biāo)代碼(object code),也就是可以在計(jì)算機(jī)硬件中運(yùn)行的機(jī)器代碼軟件程序。這一過程可以表示為:
源程序→編譯器 →目標(biāo)機(jī)器代碼程序
2.課程設(shè)計(jì)任務(wù)及要求
2.1設(shè)計(jì)任務(wù)
學(xué)生在學(xué)習(xí)《編譯原理》課程過程中,結(jié)合各章節(jié)的構(gòu)造編譯程序的基本理論,要求用C#語言描述及上機(jī)調(diào)試,實(shí)現(xiàn)一個 C編譯程序(包括詞法分析,語法分析等重要子程序),使學(xué)生將理論與實(shí)際應(yīng)用結(jié)合起來,受到軟件設(shè)計(jì)等開發(fā)過程的全面訓(xùn)練,從而提高學(xué)生軟件開發(fā)的能力。
2.2設(shè)計(jì)要求 要求:
(1)設(shè)計(jì)詞法分析器
設(shè)計(jì)各單詞的狀態(tài)轉(zhuǎn)換圖,并為不同的單詞設(shè)計(jì)種別碼。將詞法分析器設(shè)計(jì)成供語法分析器調(diào)用的子程序。功能包括:
a.具備預(yù)處理功能。將不翻譯的注釋等符號先濾掉,只保留要翻譯的符號串,即要求設(shè)計(jì)一個供詞法分析調(diào)用的預(yù)處理子程序;
b.能夠拼出語言中的各個單詞; [在此處鍵入]
c.返回(種別碼,屬性值,行號)。
(2)語法分析
要求用學(xué)習(xí)過的自底向上或自頂向下的分析方法等,實(shí)現(xiàn)對表達(dá)式、各種說明語句、控制語句進(jìn)行語法分析。若語法正確,則用語法制導(dǎo)翻譯法進(jìn)行語義翻譯;生成并打印出語法樹;若語法錯誤,要求指出出錯性質(zhì)和出錯位置(行號)。
3.算法及數(shù)據(jù)結(jié)構(gòu)
3.1算法的總體思想(流程)
本節(jié)主要分析程序的代碼結(jié)構(gòu)和代碼工程文件的劃分。(程序由幾個類組成: 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分別對應(yīng)Token類和Variable類SymbolTable類ObjectCode類Lexical類Grammar類Four_Yuan類Action類ErrorItem類的聲明和實(shí)現(xiàn)文件)。本程序采用C#語言以面向?qū)ο蟮乃枷刖帉懀绦蚍譃閹撞糠郑涸~法分析(Lexical),語法分析(Grammer),目標(biāo)代碼生成(ObjectCode)。Lexical類主要的工作是詞法分析獲取Token。Grammer類的主要工作是根據(jù)Lexical類詞法分析之后的Token進(jìn)行語法分析,生成語法樹,最后并輸出語法樹。在處理過程中,Token類的對象作為Lexical類的一個成員變量,配合Grammer類進(jìn)行語法分析。
工程文件總體上是按照九個類的格局分為十個文件,分別是九個類的聲明文件和實(shí)現(xiàn)文件。十個文件為Form1.cs,Token.cs,Variable.cs,SymbolTable.cs,ObjectCode.cs,Lexical.cs,Grammar.cs,Four_Yuan,cs,Action.cs,ErrorItem.cs,他們分別是Lexical類聲明文件、Lexical類實(shí)現(xiàn)文件、Grammer類聲明文件、Grammer類實(shí)現(xiàn)文件。[在此處鍵入]
程序流程
在程序中,Lexical類的對象(Token)作為Grammer類中的一個成員變量,配合Grammer類進(jìn)行語法分析。它們的關(guān)系是這樣的:Grammer類的一個成員變量temp首先對源程序刪除注釋,然后進(jìn)行詞法分析獲取所有Token,并將獲取的Token存儲在Token對象的tokenList(List類型)中。然后Grammer類的語法分析程序就根據(jù)tokenList中的Token進(jìn)行語法分析,生成語法樹,最后打印語法樹。同時,這也是程序的流程。[在此處鍵入]
3.2 詞法分析模塊 3.2.1功能
Lexical類主要的工作是詞法分析獲取Token序列。
3.2.2數(shù)據(jù)結(jié)構(gòu)
詞法分析階段的代碼被封裝成一個類——Lexical,Token中主要是Lexical類的聲明代碼,Lexical.cs中主要是Lexical類的實(shí)現(xiàn)代碼。Lexical類對外提供的函數(shù)主要有:
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),以上幾個函數(shù)構(gòu)成了詞法分析的骨架,在Lexical類中還有其他成員變量和函數(shù),主要作為這三個函數(shù)處理過程的中間步驟,為這三個函數(shù)服務(wù)。Lexical類的代碼結(jié)構(gòu)和主要的成員變量和函數(shù)及其含義如下圖所示:
3.2.3算法
算法的基本任務(wù)是從字符串表示的源程序中識別出具有獨(dú)立意義的單詞符號,其基本思想是[在此處鍵入]
根據(jù)掃描到單詞符號的第一個字符的種類,拼出相應(yīng)的單詞符號。
主程序示意圖:
主程序示意圖如圖3-1所示。
⑴ 關(guān)鍵字表的初值。
關(guān)鍵字作為特殊標(biāo)識符處理,把它們預(yù)先安排在一張表格中(稱為關(guān)鍵字表),當(dāng)掃描程序識別出標(biāo)識符時,查關(guān)鍵字表。如能查到匹配的單詞,則該單詞為關(guān)鍵字,否則為一般標(biāo)識符。
(2)程序中需要用到的主要變量為type和number 掃描子程序的算法思想:
首先設(shè)置3個變量: [在此處鍵入]
①token用來存放構(gòu)成單詞符號的字符串; ②number用來整型單詞;
③type用來存放單詞符號的種別碼。
Token定義
Token定義:
Token類型(TokenType):
3.3 語法分析模塊
3.3.1功能
語法分析是編譯過程的一個邏輯階段。語法分析的功能是在詞法分析的基礎(chǔ)上將單詞序列組合成各類語法短語,如“程序”,“語句”,“表達(dá)式”等等.語法分析程序判斷源程序在結(jié)構(gòu)上是否正確.源程序的結(jié)構(gòu)由上下文無關(guān)文法描述.3.3.2 數(shù)據(jù)結(jié)構(gòu)
下圖為實(shí)現(xiàn)語法分析的類Grammar,屬性與方法的作用都已說明 在此處鍵入]
3.3.3算法
1.文法
下面終結(jié)符與非終結(jié)符意義
B程序開始
Z 數(shù)據(jù)類型,如int,char,float等
V 標(biāo)識符
S 語句
P 語句塊
E 加減算術(shù)表達(dá)式
D 逗號表達(dá)式
T 乘除算術(shù)表達(dá)式
C 關(guān)系表達(dá)式
L 邏輯表達(dá)式
Q 標(biāo)識符或圓括號
e 表示空
i 表示標(biāo)識符 a)函數(shù)文法
B----ZV()S
[
[在此處鍵入]
b)語句塊文法
P----SP|e
S----{P} c)語句文法
表達(dá)式語句文法
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)表達(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.遞歸下降程序流程圖
對應(yīng)于每個文法編寫如下遞歸下降子程序
主程序(B)[在此處鍵入] [在此處鍵入]
3.4 符號表模塊
3.4.1功能
進(jìn)行符號表的儲存,添加,更新,查找,保存標(biāo)識符活躍信息以及輸出。3.4.2 數(shù)據(jù)結(jié)構(gòu)
在此處鍵入]
3.4.3算法
3.5 四元式模塊
3.5.1功能
四元式為中間代碼,編譯程序進(jìn)行完語義分析后,先生成中間代碼作為過渡,此時中間代碼與目標(biāo)代碼已經(jīng)比較相似
3.5.2 數(shù)據(jù)結(jié)構(gòu)
[ 在此處鍵入]
3.5.3算法
3.6語義動作分析模塊
3.6.1功能
在語法分析中嵌入相應(yīng)的語義動作,生成四元式 3.6.2 數(shù)據(jù)結(jié)構(gòu)
[
[在此處鍵入]
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功能 保存運(yùn)行時發(fā)現(xiàn)的錯誤,儲存行號已經(jīng)詳細(xì)信息并輸出。
3.7.2 數(shù)據(jù)結(jié)構(gòu)
3.7.3算法 [在此處鍵入]
public static void AddErrorMessage(int lineno,string content)函數(shù)用作在發(fā)現(xiàn)錯誤時保存錯誤信息以及行號。
public static string PrintErrorList()把所有發(fā)現(xiàn)的錯誤格式化后統(tǒng)一輸出。
錯誤信息在語法分析,語義分析,符號表檢錯中添加。3.8 目標(biāo)代碼模塊
3.8.1功能
目標(biāo)代碼生成把優(yōu)化后的中間代碼變換成目標(biāo)代碼,此處的目標(biāo)代碼為匯編代碼,采用單寄存器生成目標(biāo)代碼 3.8.2 數(shù)據(jù)結(jié)構(gòu)[在此處鍵入]
3.8.3算法
對于一個基本塊有如下流程圖
W:操作符,B:第一操作數(shù),C:第二操作數(shù),R:寄存器
5.結(jié)論
網(wǎng)上找一段話抄上 [在此處鍵入]
6.測試
測試打開文件
測試保存文件
如果沒打開文件,直接敲代碼,點(diǎn)保存時會彈出另存為窗口[在此處鍵入]
測試錯誤檢測,程序缺少main函數(shù)的類型,錯誤列表中顯示第一行函數(shù)缺少錯誤類型。
測試錯誤檢測,程序缺少分號,錯誤列表中顯示該行缺少語句結(jié)束標(biāo)志';' 單擊錯誤列表,會自動選定錯誤行
編譯成功,生成并顯示token串、符號表、四元式與目標(biāo)代碼 [在此處鍵入]
測試if與while語句,而且while嵌套在if當(dāng)中
測試goto語句,結(jié)果正確。[在此處鍵入]
測試優(yōu)化,輸入課件中的代碼,結(jié)果與課件一樣
6.參考文獻(xiàn)。
1、陳火旺.《程序設(shè)計(jì)語言編譯原理》(第3版).北京:國防工業(yè)出版社.2000.2、美 Alfred V.Aho Ravi Sethi Jeffrey D.Ullman著.李建中,姜守旭譯.《編譯原理》.24 [在此處鍵入]
北京:機(jī)械工業(yè)出版社.2003.3、美 Kenneth C.Louden著.馮博琴等譯.《編譯原理及實(shí)踐》.北京:機(jī)械工業(yè)出版社.2002.4、金成植著.《編譯程序構(gòu)造原理和實(shí)現(xiàn)技術(shù)》.北京:高等教育出版社.2002.7.收獲、體會和建議。
直接拷貝好歹也檢查一下錯誤
對于編譯原理的這次課程設(shè)計(jì),自己經(jīng)歷了從剛開始的不懂?明白任務(wù)的要求和內(nèi)容?理論知識的了解?開始著手寫代碼?完成基本功能?根據(jù)DFA及自頂向下等理論修改完善代碼等這些過程。
自己著手寫詞法分析的時候還不清楚詞法分析的任務(wù)內(nèi)容,還不知道詞法分析的結(jié)果是什么,詞法分析出錯的情況和類型有哪些,也總是將詞法分析和語法分析混在一起,不明白哪些錯誤在詞法分析中報,哪些錯誤在語法分析中判斷,后來經(jīng)過查書、網(wǎng)上資料、請教同學(xué)等途徑逐步清晰了詞法分析的工作內(nèi)容是從源代碼文件中獲取出Token,供語法分析使用。在充分了解了語法分析需要哪些信息時,我才真正了解了詞法分析的工作內(nèi)容和目標(biāo),才知道詞法分析需要完成哪些任務(wù)獲取到哪些信息。充分了解了詞法分析的任務(wù)之后,就開始理論知識的學(xué)習(xí)。經(jīng)過揣摩書上的例子,自己理解和掌握了怎么設(shè)計(jì)過濾注釋和分析程序中Token的DFA,于是開始根據(jù)設(shè)計(jì)好的DFA進(jìn)行編碼,最后經(jīng)過調(diào)試已經(jīng)可以正確地完成詞法階段的任務(wù)了。這只是詞法分析的原始代碼,在之后還進(jìn)行了兩次徹底的改動。雖然之前寫的詞法分析的代碼已經(jīng)完成了詞法分析的需求,也是根據(jù)DFA的原理編寫的,但是在代碼結(jié)構(gòu)上卻難以體現(xiàn),在對書上的根據(jù)已知DFA寫代碼的例子進(jìn)行了詳細(xì)的研究之后,發(fā)現(xiàn)自己的代碼并沒有像書上那樣完全按照所依據(jù)的DFA各狀態(tài)轉(zhuǎn)移的關(guān)系進(jìn)行編寫,所以對代碼進(jìn)行了重寫,像書上一樣嚴(yán)格按照狀態(tài)之間轉(zhuǎn)移的方式進(jìn)行編寫,將狀態(tài)劃分成11個狀態(tài),狀態(tài)分別按1~11進(jìn)行標(biāo)注,程序也按照DFA來編寫,也實(shí)現(xiàn)了詞法分析的功能。再后來寫報告的時候,發(fā)現(xiàn)分析出Token的那個DFA并不是最簡的,有很多多余的狀態(tài),完全可以用一個flag標(biāo)志來標(biāo)識,從而簡化代碼結(jié)構(gòu),于是又重寫了一次詞法分析函數(shù)scan()的代碼,將狀態(tài)縮減為5個,且不再用1-5來表示,而是像書上那樣分別取了名字(START、INNUM、INID、INDBSYM、DONE),同時為了簡化代碼將輸出Token到文件的部分從scan()中剝離開來,而在Lexical類中加了一個printToken()的函數(shù),使scan()函數(shù)邏輯更加清晰,使讀者能夠容易地將代碼與DFA進(jìn)行查看比照。
在寫語法分析的時候,已經(jīng)對編譯器的語法分析的內(nèi)容有了一定的了解,所以直接進(jìn)行了理論的學(xué)習(xí)。首先自己對遞歸向下分析法進(jìn)行了學(xué)習(xí),將書上的幾個遞歸向下分析的偽代碼看過之后,自己對遞歸向下的分析方法的原理有了初步的認(rèn)識,大概知道了根據(jù)文法怎么分析,但是對于如何編寫代碼卻還在此處鍵入]
是難以下手,于是就對照TINY語言的文法看了幾遍書后面的TINY語言的遞歸向下分析的語法分析程序,這樣就基本知道了C-語言的語法分析程序怎么寫。由于C-語言給出的文法有左遞歸存在,于是自己將存在左遞歸的文法改寫成EBNF的形式,并據(jù)此進(jìn)行代碼編寫。由于在編寫代碼的過程中需要確定分析是否正確或選擇多個文法中的某一個文法進(jìn)行分析,有時必須探測需要的或下一個Token的類型,在這種情況下需要求First集合,在推導(dǎo)中若存在empty,又需要求Follow集合,所以這樣又需要我了解First集合和Follow集合,自己在程序中也根據(jù)求出的First集合和Follow集合進(jìn)行判斷,以確定程序的走向。在編寫過程中,還有一類問題,就是存在公共左因子,如文法expression→ var = expression | simple-expression,左因子為ID,在分析過程中,由于已經(jīng)取出了一個ID的Token,且生成了一個IdK的節(jié)點(diǎn),但是在當(dāng)前狀態(tài)無法確定是哪一個推導(dǎo),然而IdK節(jié)點(diǎn)已經(jīng)生成,又無法回退,并且是使用自頂向下的分析方法,已經(jīng)生成的IdK在程序上方無法使用,自己通過查閱資料等途徑的學(xué)習(xí)確定了在這種情形下的處理方式:將已經(jīng)生成的IdK節(jié)點(diǎn)傳到下方的處理程序,所以TreeNode * simple_expression(TreeNode * k)、TreeNode * additive_expression(TreeNode * k)等函數(shù)都被設(shè)計(jì)成有節(jié)點(diǎn)類型參數(shù)的函數(shù),目的就是將已經(jīng)生成的節(jié)點(diǎn)傳到下面的分析函數(shù)中去。
通過這次的編譯原理課程的學(xué)習(xí)和實(shí)踐,自己獲益良多。首先最基本的成果是完成了課程設(shè)計(jì)的任務(wù),實(shí)現(xiàn)了編譯器的詞法分析和語法分析階段的功能,詞法分析主要能過濾注釋、分析出語法分析階段需要的Token并滿足語法階段的所有要求,能夠判別詞法分析階段是否出錯和出錯類型和位置。語法分析主要能根據(jù)遞歸向下的分析思想和C-文法對詞法分析獲取的Token進(jìn)行語法分析,能夠構(gòu)造出語法樹,能夠判別語法分析過程中是否出錯以及出錯位置和錯誤類型。
由于在編寫程序過程中,涉及到了正則表達(dá)式、DFA、提取公共左因子、消除左遞歸、EBNF、求First集合和Follow集合、遞歸向下分析方法以及編程語言方面的知識,所以,通過本次的課程設(shè)計(jì)的實(shí)踐,使得自己對編譯原理這門課的許多知識點(diǎn)有了更加深刻和具體的理解,而不再只限制于做題。此外,對以前那些已掌握的知識有了溫習(xí)和動手鍛煉的機(jī)會。如:以前在編譯原理課上雖然知道First集合和Follow集合怎么求的,卻不知道First集合和Follow集合到底是干什么的,通過編寫程序自己明白了他們的實(shí)際作用,使得自己不僅知其然還知其所以然,從而使得自己加深了對知識點(diǎn)的理解和掌握。由于以前編寫代碼都是使用JAVA語言,所以C/C++很多內(nèi)容都忘記了,通過本次的實(shí)踐,自己又重新拾起了以前的知識。此外,由于在做報告的時候,需要描繪DFA和程序流程圖,使得自己初步掌握了使用visio和word畫圖的能力。此外,對于文檔的編寫和美化自己也獲得了許多有用的經(jīng)驗(yàn)。[
第四篇:編譯原理 學(xué)習(xí)心得
國際學(xué)院 0802 楊良燕 200819100227
《編譯原理》課程學(xué)習(xí)心得
《編譯原理》是計(jì)算機(jī)專業(yè)的一門重要課程,正如教材
第一章的引論所述,“編譯程序是現(xiàn)代計(jì)算機(jī)系統(tǒng)的基本組成部分之一”。“一個編譯程序就是一個語言翻譯程序,語言翻譯程序把一種語言(源語言)書寫的程序翻譯成另一種語言(目標(biāo)語言)的等價程序”。
通過這一學(xué)期的學(xué)習(xí),我覺得編譯原理是一門理論性很強(qiáng)的課程,從文法和語言的概念到LL(1)文法和LR(0)文法的分析,幾乎都是對具體問題的抽象。因而,我們需要更多的時間來理解、掌握相關(guān)的知識,當(dāng)然在這一過程中也存在很多問題,比如我們后期學(xué)習(xí)具體文法的分析方法時,對于文法的概念不夠清晰,影響了上課的效率,知道老師再次給我們講解了文法等基礎(chǔ)的知識點(diǎn),我們才慢慢掌握后面所學(xué)的LL(1)文法等,也發(fā)現(xiàn)了知識點(diǎn)之間的關(guān)聯(lián)。此外,這門課程的課時被安排得很少,一周只有一次,這樣很不利于我們對這門重要課程的理解和掌握。但是我覺得我們很幸運(yùn),因?yàn)槔蠋熢谟邢薜恼n程中盡量將知識點(diǎn)以比較容易接受的方式給我們講解,教我們用簡單的方法理解記憶不同的知識,對于我們提出的問題,無論課上或是課外,老師一直是不厭其煩,甚至利用課余時間為我們講解重要的難題。
編譯原理這門課程不僅僅在于其本身的理論價值,更在于為我們解決問題提供的思維方式和方法。從LL(1)到LR(0),問題不斷被解決的同時,又有一個個新的問題提了出來。對計(jì)算機(jī)語言世界的知識積累,像滾雪球一樣越滾越大。這個逐漸遞進(jìn),逐漸解決問題的過程對我來說是收獲很大的。整個過程好像踏著前人研究編譯理論的路線,不斷感覺他們遇到的問題,更重要的是他們解決問題的思路。編譯原理的課程帶給我的不只是如何去編譯程序這樣的理論知識,相信更重要的是一種如何“自動計(jì)算”的思路。通過對相關(guān)編譯問題的具體分析,讓我體會最深的是一種“自動計(jì)算”的思想,同時完成編譯試驗(yàn)后,更是感到了一種“自動計(jì)算”的快樂?!比欢颐靼鬃约弘m然對編譯有了一定的了解,我懂得了文法的分析,學(xué)會了構(gòu)造確定和非確定有限自動機(jī),學(xué)會了LL(1)文法和LR(0)文法等,但是并沒有完全掌握,對于這些知識點(diǎn)的實(shí)質(zhì)性和其他方面,更是認(rèn)識不深。作為一名學(xué)習(xí)計(jì)算機(jī)科學(xué)與技術(shù)的學(xué)生,我明白編譯原理是軟件工程的基礎(chǔ),課程的結(jié)束并不意味著學(xué)習(xí)的結(jié)束,只有通過以后的學(xué)習(xí),才能更深入地了解編譯原理。
第五篇:編譯原理論文
編譯原理心得體會
編譯原理是計(jì)算機(jī)專業(yè)的一門重要專業(yè)課,旨在介紹編譯程序構(gòu)造的一般原理和基本方法,在計(jì)算機(jī)本科教學(xué)中占有十分重要的地位。
該課程理論性與實(shí)踐性都很強(qiáng),我們在學(xué)習(xí)是普遍感到內(nèi)容非常抽象,不易理解,內(nèi)容多且繁瑣,難以完整、全面地掌握編譯原理的有關(guān)知識,更不用說靈活運(yùn)用編譯原理知識從事相關(guān)設(shè)計(jì)或應(yīng)用于其他領(lǐng)域。雖然只有少數(shù)人從事編譯方面的工作,但是這門課在理論、技術(shù)、方法上都對我們提供了系統(tǒng)而有效的訓(xùn)練,有利于提高軟件人員的素質(zhì)和能力。
在我們學(xué)習(xí)編譯原理以前,都認(rèn)為編譯原理只能應(yīng)用在寫程序語言的編譯器上,覺得用處不大,學(xué)習(xí)興趣不高。而在后來的學(xué)習(xí)中,我們逐漸認(rèn)識到計(jì)算機(jī)專業(yè)的學(xué)生,除了要會編寫程序語言之外,還應(yīng)該了解它是如何被計(jì)算機(jī)所識別,這才是真正并且透徹地學(xué)習(xí)軟件。另外,編譯器中每一個模塊的編寫,都能對我們的編程能力的提高有很大幫助。在今后若從事軟件工程,這門課程也能夠?qū)帉懗绦蛴兴鶐椭?/p>
為了能夠系統(tǒng)掌握這門專業(yè)課,我們把編譯原理分為以下幾個模塊:①語言和文法;②詞法分析;③語法分析;④語義分析和中間代碼生成;⑤代碼優(yōu)化和目標(biāo)代碼生成。
在學(xué)習(xí)的開始,我們需要掌握什么是編譯,編譯分為哪些階段,編譯程序和解釋程序的區(qū)別等等。在做好了這些方面的準(zhǔn)備后,開始了系統(tǒng)的學(xué)習(xí)。
語言和文法部分的知識包括文法基本概念及文法的二義性?;靖拍钣形姆ǘx、推導(dǎo)、句型、句子等等。二義性文法是通過畫語法樹的方法來證明。
詞法分析中的重點(diǎn)是有窮自動機(jī)DFA的生成以及DFA和正規(guī)式與正規(guī)文法的關(guān)系。還要熟練掌握NFA轉(zhuǎn)換為DFA的方法及DFA的化簡。
語法分析包括自上而下和自下而上分析。自上而下分析著重掌握LL(1)文法,自下而上分析重點(diǎn)掌握算符優(yōu)先文法和LR(0)、SLR(1)文法。
語義分析重點(diǎn)是其功能,中間代碼生成和語法制導(dǎo)翻譯定義與方法。
最后,優(yōu)化分為局部優(yōu)化和循環(huán)優(yōu)化,重點(diǎn)理解一些關(guān)鍵詞,如基本塊、流圖等,要學(xué)會自己畫出程序流圖。用DAG圖進(jìn)行局部優(yōu)化是重點(diǎn)。
在學(xué)習(xí)文法時,對文法的組成,用法都較為明了,而在真正做題時卻感到十分吃力。例如給出了一個語言,要求寫出它的上下文無關(guān)文法,就感到十分棘手,所以今后在這方面要加大練習(xí)量,以熟練掌握。
而在之后的詞法分析和語法分析中,我感到在看基本原理時十分困難,通常要長時間鉆研才能夠有所了解,而一旦掌握了基本原理,做題時就感到十分順暢了。例如,在剛接觸到LR(0)文法時,我用了大量的時間去學(xué)習(xí)它的原理,掌握之后,在列LR(0)分析表和寫分析過程時,只要思路清晰,就會比較順暢,而且不會犯錯。
下面是我認(rèn)為的比較有效的學(xué)習(xí)編譯原理的步驟:
1.先利用ANTLR之類的編譯器生成工具,做一個小程序(如上面提到的HTML文件轉(zhuǎn)化成純文本文件的程序),所需知識只是正則表達(dá)式的基本知識和生成工具本身的使用方法(可以看聯(lián)機(jī)幫助和網(wǎng)上教程(tutorial)來掌握).這樣做的好處是:
1)可以體會到編譯原理的實(shí)用性,提高學(xué)習(xí)興趣
2)入門容易,消除編譯原理學(xué)習(xí)的畏難情緒.3)獲得詞法分析器和語法分析器的感性認(rèn)識,有利于加深對理論的理解.4)獲得編譯器自動生成工具(compiler compiler)的使用經(jīng)驗(yàn),提高解決實(shí)際問題的能力.(實(shí)際工作很多都不是手編而是利用工具的)
2.象ANTLR之類的工具是開源(open source)的,可研究其源碼,以便必要時自己手編分析程序.3.回過頭來看編譯原理教材.這時大概會發(fā)現(xiàn),很多理論很容易懂,剩下的只有上面說的幾個難點(diǎn),多看幾遍,重點(diǎn)突破.4.結(jié)合教材所附源碼,進(jìn)一步加深對教材的理解。以上就是我對這門課的心得體會。