生成函數語法樹編譯原理
Ⅰ 鍩虹路緙栬瘧鍘熺悊
娣卞叆鎺㈢儲緙栬瘧鍘熺悊錛氫粠鍩虹鍒伴珮綰цВ鏋
涓銆佺紪璇戠▼搴忕殑濂ョ
緙栬瘧鍣錛岃繖搴ч氬線鏈哄櫒璇璦鐨勬ˉ姊侊紝灝嗘簮浠g爜鐨勯瓟娉曡漿鍖栦負鏈哄櫒鑳界悊瑙g殑鎸囦護銆傚畠鐨勬棶紼嬪垎涓哄叚姝ワ細璇嶆硶鍒嗘瀽錛堝皢婧愪唬鐮佸垎鍓蹭負涓涓涓鍙璇嗗埆鐨勫崟鍏冿級銆佽娉曞垎鏋愶紙瑙f瀽浠g爜緇撴瀯錛夈佽涔夊垎鏋愶紙璧嬩簣姣忎釜絎﹀彿鎰忎箟錛夈佷腑闂翠唬鐮佺敓鎴愶紙涓哄悗緇浼樺寲鍋氬噯澶囷級銆佷唬鐮佷紭鍖栵紙鎻愬崌鏁堢巼錛夊拰鐩鏍囦唬鐮佺敓鎴愶紙鐢熸垚鏈緇堝彲鎵ц屾枃浠訛級銆傜紪璇戣繃紼嬪閥濡欒繍鐢ㄨ〃鏍肩$悊錛屽墠絝璁捐℃椂鐩鏍囨満鏃犲叧錛岃屽悗絝璁捐″垯緔у瘑緇戝畾鐩鏍囧鉤鍙扮壒鎬с
浜屻佽В閲婄▼搴忎笌緙栬瘧紼嬪簭鐨勫樊寮
涓庣紪璇戠▼搴忎笉鍚岋紝瑙i噴鍣ㄩ愯屾墽琛屾簮浠g爜錛屼笉鐢熸垚鍙鎵ц屾枃浠訛紝榪欎嬌寰楄В閲婄▼搴忚櫧鐒舵槗浜庤皟璇曪紝浣嗛熷害杈冩參涓斿崰鐢ㄥ唴瀛樿緝澶с
涓夈佽娉曚笌鏂囨硶鐨勬ˉ姊
璇璦鐨勮摑鍥劇敱璇娉曞拰璇涔夊叡鍚屾瀯寤恆備笂涓嬫枃鏃犲叧鏂囨硶錛屽傚悓璇璦鐨勯氱敤璇娉曡勫垯錛屾槸鎻忚堪鍜岀悊瑙h璦緇撴瀯鐨勫叧閿宸ュ叿銆
鍥涖佺粓緇撶︿笌闈炵粓緇撶︾殑瀵嗙爜
緇堢粨絎︼紝濡傚悓璇璦鐨勫熀鏈鍏冪礌錛岄潪緇堢粨絎﹀垯鏄鐢辯粓緇撶﹀拰鏂囨硶瑙勫垯緇勫悎鑰屾垚鐨勬娊璞℃傚康錛屽叡鍚屾瀯鎴愪簡璇璦鐨勫熀鐭熾
浜斻丒BNF錛氭墿灞曠殑璇娉曟弿榪扮
EBNF錛圗xtended Backus-Naur Form錛夋槸涓縐嶅己澶х殑絎﹀彿琛ㄧず娉曪紝鐢ㄤ簬娓呮櫚瀹氫箟澶嶆潅璇璦緇撴瀯錛屾棤璁烘槸綆鍗曠被鍨嬭繕鏄鑷瀹氫箟綾誨瀷錛岄兘鍙閫氳繃瀹冪簿鍑嗗畾涔夈
鍏銆佹帰緔㈣璦鐨勭﹀彿涓栫晫
閫氳繃瀛楁瘝琛▄0, 1}錛屾垜浠鍙浠ユ瀯閫犲嚭濡00銆10榪欐牱鐨勭﹀彿涓層備覆榪炴帴銆佸籙榪愮畻鍜岄泦鍚堣繍綆楋紝濡侫={a, b}脳B={c, d} = {ac, ad, bc, bd}錛屽睍紺轟簡絎﹀彿涓茬殑涓板瘜鎬с傞棴鍖呮傚康鎻紺轟簡鎵鏈夋湁闄愰暱涓茬殑闆嗗悎鐗規с
涓冦佹枃娉曠殑鏋勯犱笌瑙f瀽
鏂囨硶鐢遍潪緇堢粨絎﹂泦銆佺粓緇撶﹂泦銆佽勫垯闆嗗拰璇嗗埆絎︾粍鎴愶紝濡俛->b錛屾枃娉曚功鍐欎負G[S]銆傛帹瀵間笌瑙勭害灞曠ず浜嗚璦鏋勯犵殑閫昏緫錛屽彞鍨嬪拰璇璦鍒欐槸鏂囨硶浣滅敤鐨勪綋鐜幫紝涔斿嗘柉鍩哄洓鍨嬫枃娉曞睍紺轟簡閫掑綊鍜屼笂涓嬫枃鐩稿叧鎬х殑涓嶅悓灞傛°
鍏銆佽娉曟爲錛氳璦鐨勭粨鏋勪箣緹
璇娉曟爲鐘瑰傜紪璇戠殑钃濆浘錛屾瘡涓鑺傜偣鏍囪頒負V絎﹀彿錛屼粠鏍硅妭鐐筍鍑哄彂錛岄伒寰鐗瑰畾瑙勫垯錛岀洿瑙傛彮紺哄彞鍨嬫帹瀵肩殑緇撴瀯銆
涔濄佽勮寖鎺ㄥ間笌鍙ュ瀷鍒嗘瀽
瑙勮寖鎺ㄥ肩『淇濊В鏋愯繃紼嬬殑鍞涓鎬э紝娑堥櫎浜屼箟鎬э紝鑰屽彞鍨嬪垎鏋愬垯閫氳繃鑷涓婅屼笅鎴栬嚜涓嬭屼笂鐨勬柟娉曪紝楠岃瘉絎﹀彿涓叉槸鍚︾﹀悎鏂囨硶銆
鍗併佺Щ榪-褰掔害鍒嗘瀽涓庝紭鍏堝垎鏋愭硶
縐昏繘-褰掔害鍒嗘瀽灝嗚緭鍏ラ愪釜瑙f瀽錛岀畻絎︿紭鍏堝垎鏋愬垯鏍規嵁榪愮畻絎︿紭鍏堢駭鍐沖畾鎿嶄綔欏哄簭銆備笁縐嶄紭鍏堝叧緋誨畾涔変簡鍒嗘瀽鐨勭簿緇嗘ラわ紝浠庣畝鍗曚紭鍏堝埌綆楃︿紭鍏堬紝鏁堢巼鍜岄傜敤鑼冨洿鍚勫紓銆
鍗佷竴銆丩R鍒嗘瀽鍣錛氳В鏋愮殑寮哄ぇ宸ュ叿
LR鍒嗘瀽鍣ㄦ槸瑙f瀽澶嶆潅鏂囨硶鐨勫己澶ф﹀櫒錛屽畠閫氳繃ACTION琛ㄥ拰GOTO琛錛屼互鍙婃枃娉曠﹀彿鍜岀姸鎬佺殑宸у欑$悊錛岀『淇濊В鏋愮殑楂樻晥鍜屽噯紜鎬с
鍗佷簩銆佹爤鍦ㄨВ鏋愪腑鐨勮掕壊
鏍堝湪褰掔害銆佹帴鍙楀拰鎶ラ敊榪囩▼涓鎵婕斿叧閿瑙掕壊錛屽綊綰︽椂璋冩暣鐘舵侊紝鎺ュ彈鏃剁『璁ゅ紑濮嬶紝閿欒鏃跺垯鍙戝嚭璀﹀憡銆侺R鍒嗘瀽鍣ㄧ殑鍏抽敭鍦ㄤ簬鍒嗘瀽琛ㄧ殑鏋勫緩錛屽喅瀹氫簡瑙f瀽鍣ㄧ殑鎬ц兘鍜屾g『鎬с
鍗佷笁銆丩R(0)鍒嗘瀽鐨勭簿濡欎箣澶
媧誨墠緙DFA鐨勬瀯寤猴紝閫氳繃姝h勮〃杈懼紡鍜岄」鐩闆嗚勮寖鏃忥紝鎻紺轟簡LR(0)鍒嗘瀽鐨勬繁灞傞昏緫錛屽畠鍦ㄧ畝鍖栧啿紿佸勭悊鐨勫悓鏃訛紝鍏奸【浜嗗瓨鍌ㄦ晥鐜囧拰瑙f瀽鑳藉姏銆
緙栬瘧鍘熺悊鐨勬棶紼嬫繁鍏ヨ屼赴瀵岋紝姣忎竴鐜鑺傞兘濡傚悓璇璦鐨勬瀯閫犱箰璋憋紝浜ょ粐鍑鴻$畻鏈虹戝︾殑浜ゅ搷涔愮珷銆備粠鍩虹鐨勮勫垯瑙f瀽錛屽埌楂樼駭鐨勫垎鏋愭柟娉曪紝姣忎竴絝犻兘涓虹悊瑙d唬鐮佽儗鍚庣殑閫昏緫鎻愪緵浜嗗叧閿鐨勬ˉ姊併
Ⅱ 編譯原理簡單嗎
編譯原理主要是講了編譯器的實現。
那什麼是編譯器呢?
編譯器就是將 源程序→編譯器 →目標機器代碼的程序
本文將用一段最簡單的代碼進行說明
1 + 2 + 3
第一步. 詞法分析
當代碼從文件中被讀入到編輯器時,將會進行詞法分析
示例中的代碼最終會轉換為(下面為偽代碼)
1 ADD 2 ADD 3
第二步. 語法分析
這一步編譯器將會把詞法分析的結果轉換成AST(abstract syntax tree, 抽象語法樹)
所有的操作數將會作為子節點,所有的操作符將會作為父節點。(不知道的同學可以看一下樹的生成)
1 + 2 + 3 對應的樹
3. 生成目標代碼
對上面的樹進行後序遍歷,將會得到下面的偽代碼
((1 2 +) 3 +)
生成的匯編偽代碼為
START:
MOV VALUE, 0//初始化結果為0
ADD VALUE, 1
ADD VALUE, 2//(1 2 +)的匯編偽代碼
ADD VALUE, 3
RET VALUE
END
最終匯編代碼會被編譯成機器代碼,在計算機上執行。
下面為一般情況下的編譯流程
1. 詞法分析(生成代碼對應的token序列,使用正則表達式)
2. 語法分析(生成AST)
3. 語義分析(對代碼的語法進行檢查)
4. 代碼生成(生成可執行的代碼)
Ⅲ 編譯原理全部的名詞解釋
書上有別那麼懶!.
編譯過程的六個階段:詞法分析,語法分析,語義分析,中間代碼生成,代碼優化,目標代碼生成
解釋程序:把某種語言的源程序轉換成等價的另一種語言程序——目標語言程序,然後再執行目標程序.解釋方式是接受某高級語言的一個語句輸入,進行解釋並控制計算機執行,馬上得到這句的執行結果,然後再接受下一句.
編譯程序:就是指這樣一種程序,通過它能夠將用高級語言編寫的源程序轉換成與之在邏輯上等價的低級語言形式的目標程序(機器語言程序或匯編語言程序).
解釋程序和編譯程序的根本區別:是否生成目標代碼
句子的二義性(這里的二義性是指語法結構上的.):文法G[S]的一個句子如果能找到兩種不同的最左推導(或最右推導),或者存在兩棵不同的語法樹,則稱這個句子是二義性的.
文法的二義性:一個文法如果包含二義性的句子,則這個文法是二義文法,否則是無二義文法.
LL(1)的含義:(LL(1)文法是無二義的; LL(1)文法不含左遞歸)
第1個L:從左到右掃描輸入串 第2個L:生成的是最左推導
1 :向右看1個輸入符號便可決定選擇哪個產生式
某些非LL(1)文法到LL(1)文法的等價變換: 1. 提取公因子 2. 消除左遞歸
文法符號的屬性:單詞的含義,即與文法符號相關的一些信息.如,類型、值、存儲地址等.
一個屬性文法(attribute grammar)是一個三元組A=(G, V, F)
G:上下文無關文法.
V:屬性的有窮集.每個屬性與文法的一個終結符或非終結符相連.屬性與變數一樣,可以進行計算和傳遞.
F:關於屬性的斷言或謂詞(一組屬性的計算規則)的有窮集.斷言或語義規則與一個產生式相聯,只引用該產生式左端或右端的終結符或非終結符相聯的屬性.
綜合屬性:若產生式左部的單非終結符A的屬性值由右部各非終結符的屬性值決定,則A的屬性稱為綜合屬
繼承屬性:若產生式右部符號B的屬性值是根據左部非終結符的屬性值或者右部其它符號的屬性值決定的,則B的屬性為繼承屬性.
(1)非終結符既可有綜合屬性也可有繼承屬性,但文法開始符號沒有繼承屬性.
(2) 終結符只有綜合屬性,沒有繼承屬性,它們由詞法程序提供.
在計算時: 綜合屬性沿屬性語法樹向上傳遞;繼承屬性沿屬性語法樹向下傳遞.
語法制導翻譯:是指在語法分析過程中,完成附加在所使用的產生式上的語義規則描述的動作.
語法制導翻譯實現:對單詞符號串進行語法分析,構造語法分析樹,然後根據需要構造屬性依賴圖,遍歷語法樹並在語法樹的各結點處按語義規則進行計算.
中間代碼(中間語言)
1、是復雜性介於源程序語言和機器語言的一種表示形式.
2、一般,快速編譯程序直接生成目標代碼.
3、為了使編譯程序結構在邏輯上更為簡單明確,常採用中間代碼,這樣可以將與機器相關的某些實現細節置於代碼生成階段仔細處理,並且可以在中間代碼一級進行優化工作,使得代碼優化比較容易實現.
何謂中間代碼:源程序的一種內部表示,不依賴目標機的結構,易於代碼的機械生成.
為何要轉換成中間代碼:(1)邏輯結構清楚;利於不同目標機上實現同一種語言.
(2)便於移植,便於修改,便於進行與機器無關的優化.
中間代碼的幾種形式:逆波蘭記號 ,三元式和樹形表示 ,四元式
符號表的一般形式:一張符號表的的組成包括兩項,即名字欄和信息欄.
信息欄包含許多子欄和標志位,用來記錄相應名字和種種不同屬性,名字欄也稱主欄.主欄的內容稱為關鍵字(key word).
符號表的功能:(1)收集符號屬性 (2) 上下文語義的合法性檢查的依據: 檢查標識符屬性在上下文中的一致性和合法性.(3)作為目標代碼生成階段地址分配的依據
符號的主要屬性及作用:
1. 符號名 2. 符號的類型 (整型、實型、字元串型等))3. 符號的存儲類別(公共、私有)
4. 符號的作用域及可視性 (全局、局部) 5. 符號變數的存儲分配信息 (靜態存儲區、動態存儲區)
存儲分配方案策略:靜態存儲分配;動態存儲分配:棧式、 堆式.
靜態存儲分配
1、基本策略
在編譯時就安排好目標程序運行時的全部數據空間,並能確定每個數據項的單元地址.
2、適用的分配對象:子程序的目標代碼段;全局數據目標(全局變數)
3、靜態存儲分配的要求:不允許遞歸調用,不含有可變數組.
FORTRAN程序是段結構,不允許遞歸,數據名大小、性質固定. 是典型的靜態分配
動態存儲分配
1、如果一個程序設計語言允許遞歸過程、可變數組或允許用戶自由申請和釋放空間,那麼,就需要採用動態存儲管理技術.
2、兩種動態存儲分配方式:棧式,堆式
棧式動態存儲分配
分配策略:將整個程序的數據空間設計為一個棧.
【例】在具有遞歸結構的語言程序中,每當調用一個過程時,它所需的數據空間就分配在棧頂,每當過程工作結束時就釋放這部分空間.
過程所需的數據空間包括兩部分
一部分是生存期在本過程這次活動中的數據對象.如局部變數、參數單元、臨時變數等;
另一部分則是用以管理過程活動的記錄信息(連接數據).
活動記錄(AR)
一個過程的一次執行所需要的信息使用一個連續的存儲區來管理,這個區 (塊)叫做一個活動記錄.
構成
1、臨時工作單元;2、局部變數;3、機器狀態信息;4、存取鏈;
5、控制鏈;6、實參;7、返回地址
什麼是代碼優化
所謂優化,就是對代碼進行等價變換,使得變換後的代碼運行結果與變換前代碼運行結果相同,而運行速度加快或佔用存儲空間減少.
優化原則:等價原則:經過優化後不應改變程序運行的結果.
有效原則:使優化後所產生的目標代碼運行時間較短,佔用的存儲空間較小.
合算原則:以盡可能低的代價取得較好的優化效果.
常見的優化技術
(1) 刪除多餘運算(刪除公共子表達式) (2) 代碼外提 +刪除歸納變數+ (3)強度削弱; (4)變換循環控制條件 (5)合並已知量與復寫傳播 (6)刪除無用賦值
基本塊定義
程序中只有一個入口和一個出口的一段順序執行的語句序列,稱為程序的一個基本塊.
給我分數啊.
Ⅳ 編譯原理筆記9:語法分析樹、語法樹、二義性的消除
語法分析樹和語法樹不是一種東西 。習慣上,我們把前者叫做「具體語法樹」,其能夠體現推導的過程;後者叫做「抽象語法樹」,其不體現過程,只關心最後的結果。
語法分析樹是語言推導過程的圖形化表示方法。這種表示方法反映了語言的實質以及語言的推導過程。
定義:對於 CFG G 的句型,分析樹被定義為具有下述性質的一棵樹:
推導,有最左推導和最右推導,這兩種推導方式在推導過程中的分析樹可能不同,但因最終得到的句子是相同的,所以最終的分析樹是一樣的。
分析樹能反映句型的推導過程,也能反映句型的結構。然而實際上,我們往往不關心推導的過程,而只關心推導的結果。因此,我們要對 分析樹 進行改造,得到 語法樹 。語法樹中全是終結符,沒有非終結符。而且語法樹中沒有括弧
定義:
說白了,語法樹這玩意,就一句話: 葉子全是操作數,內部全是操作符 ,樹里沒有非終結符也不能有括弧。
語法樹要表達的東西,是操作符(運算)作用於操作數(運算對象)
舉倆例子吧:
【例】: -(id+id) 的語法樹:
【例】:-id+id 的語法樹:
顯然,我們從上面這兩個語法樹中,直接就能觀察出來它們的運算順序。
【例】:句型 if C then s1 else s2
二義性問題:一個句子可能對應多於一棵語法樹。
【例】: 設文法 G: E → E+E | E*E | (E) | -E | id
則,句子 id+id*id、id+id+id 可能的分析樹有:
在該例中,雖然 id+id+id 的 「+」 的結合性無論左右都不會影響結果。但萬一,萬一「+」的含義變成了「減法」,那麼左結合和右結合就會引起很大的問題了。
我們在這里講的「二義性」的「義」並非語義——我們現在在學習的內容是「語法分析器」,尚未到需要研究語言背後含義的階段。
我們現在講的「二義性」指的是一個句子對應多種分析樹。
二義性的體現,是文法對同一句子有不止一棵分析樹。這種問題由【句子產生過程中的某些推導有多於一種選擇】引起。懸空 else 問題就可以很好地體現這種【超過一種選擇】帶來的二義性問題,示例如下。
看下面這么個例子。。
(其實,我感覺這個其實比較像是「說話大喘氣」帶來的理解歧義問題。。。)上面的產生式中並沒體現出來該咋算分一塊,所以兩種完全不同的句子結構都是合法的。
二義性問題是有救的,大概有以下這三種辦法:
這些辦法的核心,其實都是將優先順序和結合性說明白。
核心:把優先順序和結合性說明白
既然要說明白,那就不能讓一個非終結符可以直接在當次推導中能推出會帶來優先順序和結合性歧義的東西。(對分析樹的一個內部節點,不會有出現在其下面的分支是相同的非終結符的情況。如果有得選,那就有得歧義了。沒得選才能確定地一路走到黑)
改寫為非二義文法的二義文法大概有下面這幾個特點:
改寫的關鍵步驟:
【例】改寫下面的二義文法為非二義文法。圖右側是要達成的優先順序和結合性
改寫的核心其實就兩句話:
所以能夠得到非終結符與運算的對應關系(因為不同的運算有不同的優先順序,我們想要引入多個優先順序就要引入多個新的非終結符。這樣每個非終結符就可以負責一個優先順序的運算符號,也就是說新的非終結符是與運算有關系的了。因此這里搞出來了「對應關系」四個字)如下:
優先順序由低到高分別是 +、 、-,而距離開始符號越近,優先順序越低。因此在這里的排序也可以+ -順序。每個符號對應一層的非終結符。根據所需要的結合性,則可確定是左遞歸還是右遞歸,以確定新的產生式長什麼樣子
【例】:規定優先順序和結合性,寫出改寫的非二義文法
我們已經掌握了一種叫做【改寫】的工具,能讓我們消除二義性。接下來我們就要用這個工具來嘗試搞搞懸空 else 問題!
懸空 else 問題出現的原因是 then 數量多於 else,讓 else 有多個可以結合的 then。在二義文法中,由於選哪兩個 then、else 配對都可以,故會引起出現二義的情況。在這里,我們規定 else 右結合,即與左邊最靠近的 then 結合。
為改寫此文法,可以將 S 分為完全匹配(MS)和不完全匹配(UMS)兩類。在 MS 中體現 then、else 個數相等即匹配且右結合;在UMS 中 then、else 不匹配,體現 else 右結合。
【例】:用改寫後的文法寫一個條件語句
經過檢查,無法再根據文法寫出其他分析樹,故已經消除了二義性
雖然二義文法會導致二義性,但是其並非一無是處。其有兩個顯著的優點:
在 Yacc 中,我們可以直接指定優先順序、結合性而無需自己重寫文法。
left 表示左結合,right 表示右結合。越往下的算符優先順序越高。
嗯就這么簡單。。。
我們其實可以把語言本身定義成沒有優先順序和結合性的。。然後所有的優先、結合都交由括弧進行控制,哪個先算就加括弧。把一個過程的結束用明確的標志標記出來。
比如在 Ada 中:
在 Pascal 中,給表達式加括弧:
Ⅳ 編譯原理
編譯原理是計算機科學中的一慎昌門重要課程,主要研究如段配何將高級程序語言轉化為機器語言寬燃扒的過程。它涉及到多個領域,如語言學、數學、計算機硬體和操作系統等。編譯器是實現這一過程的關鍵工具,它可以將程序源代碼轉化為可執行的機器代碼。
Ⅵ 如何由文法推導語法樹(編譯原理)
語法樹,是針對上下文無關文法,用來表示一個句型的生成過程的一種描述手段。
對於給定的句型,依據文法構造它的語法樹,是語法分析的任務。
編譯原理課程中重點學習的各種語法分析方法,都是解決語法樹的構造的具體分析方法。
在學習並掌握各種語法分析方法之前,一般只能依據直覺印象,通過猜測、拼湊等手段,去試著推演,湊出符合要求的句型的語法樹。所以這個階段練慣用的題目一般也不很復雜,通過多多練習也能找到一些技巧(其實主要是後面將要學習的自頂向下語法分析中的一些原則)。
對於給定的文法,有一些句型可能能構建出兩棵甚至多棵結構不同的語法樹,結果不一定是唯一的。這樣的文法就是所謂的二義性文法。
對於非二義性文法而言,任意一個句型的語法樹都是唯一的。
Ⅶ 編譯原理 學的是什麼
編譯原理是計算機專業的一門重要專業課,旨在介紹編譯程序構造的一般原理和基本方法。內容包括語言和文法、詞法分析、語法分析、語法制導翻譯、中間代碼生成、存儲管理、代碼優化和目標代碼生成。 編譯原理是計算機專業設置的一門重要的專業課程。雖然只有少數人從事編譯方面的工作,但是這門課在理論、技術、方法上都對學生提供了系統而有效的訓練,有利於提高軟體人員的素質和能力。 目前各個大學使用的教材機械工業出版社、國防工業出版社出版的《編譯原理》。
編譯原理課程
這門課程關注的是編譯器方面的產生原理和技術問題,似乎和計算機的基礎領域不沾邊,可是編譯原理卻一直作為大學本科的 必修課程,同時也成為了研究生入學考試的必考內容。編譯原理及技術從本質上來講就是一個演算法問題而已,當然由於這個問題十分復雜,其解決演算法也相對復雜。 我們學的數據結構與演算法分析也是講演算法的,不過講的基礎演算法,換句話說講的是演算法導論,而編譯原理這門課程講的就是比較專註解決一種的演算法了。在20世紀 50年代,編譯器的編寫一直被認為是十分困難的事情,第一Fortran的編譯器據說花了18年的時間才完成。在人們嘗試編寫編譯器的同時,誕生了許多跟 編譯相關的理論和技術,而這些理論和技術比一個實際的編譯器本身價值更大。就猶如數學家們在解決著名的哥德巴赫猜想一樣,雖然沒有最終解決問題,但是其間 誕生不少名著的相關數論。
Ⅷ 編譯原理
編譯原理是計算機專業的一門重要專業課,旨在介紹編譯程序構造的一般原理和基本方法。內容包括語言和文法、詞法分析、語法分析、語法制導翻譯、中間代碼生成、存儲管理、代碼優化和目標代碼生成。 編譯原理是計算機專業設置的一門重要的專業課程。編譯原理課程是計算機相關專業學生的必修課程和高等學校培養計算機專業人才的基礎及核心課程,同時也是計算機專業課程中最難及最挑戰學習能力的課程之一。編譯原理課程內容主要是原理性質,高度抽象[1]。
中文名
編譯原理[1]
外文名
Compilers: Principles, Techniques, and Tools[1]
領域
計算機專業的一門重要專業課[1]
快速
導航
編譯器
編譯原理課程
編譯技術的發展
編譯的基本流程
編譯過程概述
基本概念
編譯原理即是對高級程序語言進行翻譯的一門科學技術, 我們都知道計算機程序由程序語言編寫而成, 在早期計算機程序語言發展較為緩慢, 因為計算機存儲的數據和執行的程序都是由0、1代碼組合而成的, 那麼在早期程序員編寫計算機程序時必須十分了解計算機的底層指令代碼通過將這些微程序指令組合排列從而完成一個特定功能的程序, 這就對程序員的要求非常高了。人們一直在研究如何如何高效的開發計算機程序, 使編程的門檻降低。[2]
編譯器
C語言編譯器是一種現代化的設備, 其需要藉助計算機編譯程序, C語言編譯器的設計是一項專業性比較強的工作, 設計人員需要考慮計算機程序繁瑣的設計流程, 還要考慮計算機用戶的需求。計算機的種類在不斷增加, 所以, 在對C語言編譯器進行設計時, 一定要增加其適用性。C語言具有較強的處理能力, 其屬於結構化語言, 而且在計算機系統維護中應用比較多, C語言具有高效率的優點, 在其不同類型的計算機中應用比較多。[3]
C語言編譯器前端設計
編譯過程一般是在計算機系統中實現的, 是將源代碼轉化為計算機通用語言的過程。編譯器中包含入口點的地址、名稱以及機器代碼。編譯器是計算機程序中應用比較多的工具, 在對編譯器進行前端設計時, 一定要充分考慮影響因素, 還要對詞法、語法、語義進行分析。[3]
1 詞法分析[3]
詞法分析是編譯器前端設計的基礎階段, 在這一階段, 編譯器會根據設定的語法規則, 對源程序進行標記, 在標記的過程中, 每一處記號都代表著一類單詞, 在做記號的過程中, 主要有標識符、關鍵字、特殊符號等類型, 編譯器中包含詞法分析器、輸入源程序、輸出識別記號符, 利用這些功能可以將字型大小轉化為熟悉的單詞。[3]
2 語法分析[3]
語法分析是指利用設定的語法規則, 對記號中的結構進行標識, 這包括句子、短語等方式, 在標識的過程中, 可以形成特殊的結構語法樹。語法分析對編譯器功能的發揮有著重要影響, 在設計的過程中, 一定要保證標識的准確性。[3]
3 語義分析[3]
語義分析也需要藉助語法規則, 在對語法單元的靜態語義進行檢查時, 要保證語法規則設定的准確性。在對詞法或者語法進行轉化時, 一定要保證語法結構設置的合法性。在對語法、詞法進行檢查時, 語法結構設定不合理, 則會出現編譯錯誤的問題。前端設計對精確性要求比較好, 設計人員能夠要做好校對工作, 這會影響到編譯的准確性, 如果前端設計存在失誤, 則會影響C語言編譯的效果。[3]
Ⅸ 編譯原理
編譯原理):利用編譯程序從源語言編寫的源程序產生目標程序的過程; 用編譯程序產生目標程序的動作。 編譯就是把高級語言變成計算機可以識別的2進制語言,計算機只認識1和0,編譯程序把人們熟悉的語言換成2進制的。
編譯程序把一個源程序翻譯成目標程序的工作過程分為五個階段:詞法分析;語法分析;語義檢查和中間代碼生成
(9)生成函數語法樹編譯原理擴展閱讀:
編譯程序的語法分析器以單詞符號作為輸入,分析單詞符號串是否形成符合語法規則的語法單位,如表達式、賦值、循環等,最後看是否構成一個符合要求的程序,按該語言使用的語法規則分析檢查每條語句是否有正確的邏輯結構,程序是最終的一個語法單位。
編譯程序的語法規則可用上下文無關文法來刻畫。語法分析的方法分為兩種:自上而下分析法和自下而上分析法。自上而下就是從文法的開始符號出發,向下推導,推出句子。
而自下而上分析法採用的是移進歸約法,基本思想是:用一個寄存符號的先進後出棧,把輸入符號一個一個地移進棧里,當棧頂形成某個產生式的一個候選式時,即把棧頂的這一部分歸約成該產生式的左鄰符號。