導航:首頁 > 源碼編譯 > 編譯原理或運算連接多個

編譯原理或運算連接多個

發布時間:2024-09-04 09:52:36

㈠ C語言編譯原理是什麼

編譯共分為四個階段:預處理階段、編譯階段、匯編階段、鏈接階段。
1、預處理階段:
主要工作是將頭文件插入到所寫的代碼中,生成擴展名為「.i」的文件替換原來的擴展名為「.c」的文件,但是原來的文件仍然保留,只是執行過程中的實際文件發生了改變。(這里所說的替換並不是指原來的文件被刪除)
2、匯編階段:
插入匯編語言程序,將代碼翻譯成匯編語言。編譯器首先要檢查代碼的規范性、是否有語法錯誤等,以確定代碼的實際要做的工作,在檢查無誤後,編譯器把代碼翻譯成匯編語言,同時將擴展名為「.i」的文件翻譯成擴展名為「.s」的文件。
3、編譯階段:
將匯編語言翻譯成機器語言指令,並將指令打包封存成可重定位目標程序的格式,將擴展名為「.s」的文件翻譯成擴展名為「.o」的二進制文件。
4、鏈接階段:
在示例代碼中,改代碼文件調用了標准庫中printf函數。而printf函數的實際存儲位置是一個單獨編譯的目標文件(編譯的結果也是擴展名為「.o」的文件),所以此時主函數調用的時候,需要將該文件(即printf函數所在的編譯文件)與hello
world文件整合到一起,此時鏈接器就可以大顯神通了,將兩個文件合並後生成一個可執行目標文件。

㈡ 編譯原理中的閉包含義

這個是能畫的最簡單的,左邊是開始狀態。原則是:1)先連接運算,2)再選擇3)再閉包

㈢ 編譯原理學習ing(1)詞法分析——符號和文法

學習編譯原理,首先要理解詞法分析的基礎概念。它涉及字母表中的符號,如字元、字元串和字元運算(如空串、連接、冪運算、乘積以及閉包)。文法是核心,它由兩個非交集的集合——終結符集和非終結符集——以及消配則映射規則組成,規則通過開始符號(來自非終結符集)生成字元串。

文法通常用G(Vn, Vt, P, S)表示,其中Vn和Vt分別代表非終結符集和終結符集,P是產生式集,S是開始符號。例如,一個簡單的文法可以表示為A-≥a,這意味著A可以推導為字元a。在文法G的作用下,通過規則推導形成句型,最終得到終結符串——句子,即語言L(G)。文法的等價性意味著不同的文法可能產生相同的語言。

對於文法的分類,上下文無關文法(2型文法)和語法樹是關鍵概念。語法樹通過標記和規則描述推導過程,但可能存在二義性,即同一種文法可以產生不同語法樹。短語、直接短語和句柄的概念在句型分析中至關重要,用於確認句子是否符合文法。

在詞法分析中,通過正則表達式或正規式(正規賣或集)分析輸入,將字元轉化為tokens,這是程序識別和處理語言的第一步。確定有限自動機(DFA)和非確定有限自動機(NFA)是自動化識別過程的基礎,它們以不同的規則描述輸入字元的接受方式。NFA與DFA雖然有區別,但它們在識別能力上是等價的,拿棚任何NFA都可以轉換為等價的DFA。

㈣ 編譯原理筆記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 中,給表達式加括弧:

閱讀全文

與編譯原理或運算連接多個相關的資料

熱點內容
單片機程序電子版 瀏覽:599
路由器加密模式只有wpa2 瀏覽:530
ug刪除加密 瀏覽:433
安卓手機如何下載最低版本的抖音 瀏覽:778
sprint演算法 瀏覽:444
數控編程學習資料 瀏覽:177
pdf語文 瀏覽:943
單片機小學比賽 瀏覽:95
條件預編譯多條件 瀏覽:394
物理學好可以當程序員嗎 瀏覽:435
jsp圖片網站源碼 瀏覽:845
美股開盤加密貨幣大跌 瀏覽:18
ubuntuphp伺服器 瀏覽:189
伺服器編輯器如何寫 瀏覽:384
我有一套源碼自帶採集 瀏覽:112
對稱加密演算法的特點 瀏覽:47
河池看房用什麼app 瀏覽:283
linuxnameserver 瀏覽:91
與數學相關的文件夾名稱 瀏覽:292
證據推理演算法實例 瀏覽:165