1. 程式人生 > >編譯原理期末複習考點總結(一) 通俗易懂的方式解釋概念(純手打)

編譯原理期末複習考點總結(一) 通俗易懂的方式解釋概念(純手打)

編譯原理總結

基礎概念

  1. 編譯程式是什麼?
    能把源語言程式轉換成目標語言程式的程式。

  2. 編譯過程
    詞法分析:
    掃描源程式,將其分解為詞法單元后輸出。
    方法:正規式,有限自動機。

    語法分析:
    根據語法規則,對詞法單元進行推導或規約,識別出各類語法單元,最終判斷輸入串語法是否正確。
    方法:上下文無關文法。

    語義分析與中間程式碼生成:
    使用語法樹和符號表對語法單元進行語義分析並把他們翻譯成一定形式的中間程式碼。
    方法:等價變換。

    優化:
    對中間程式碼進行優化處理。

    目的碼生成:
    把中間程式碼翻譯成目標程式。


  3. 對源程式或中間結果從頭到尾掃描一次,並做加工處理,生成新的中間結果或目標程式的過程。

  4. 前端
    與源語言有關而與目標機器無關的部分。

  5. 後端
    與源語言無關而與目標機器有關的部分。

  6. 文法
    描述語言的語法結構的形式規則

  7. 語法樹
    用來描述句型推導的一棵樹

  8. 上下文無關文法
    所定義的語法單位與上下文(環境)無關。

    包括:
    終結符:
    直觀的是語法樹的葉子結點、句子中的單詞或字。
    例如:He,give,a,b……

    非終結符:
        語法樹的分支結點、句子中的語法成分。
        例如:<冠詞>,A,B……
    
    開始符號:
        語法樹的根結點、句子。
        例如:<句子>,S……
    
    產生式:
        由一種高階的語法成分推出低階的若干語法成分的式子。
        例如:<間接賓語> -> <冠詞><名詞>,S—>A|B……
    
  9. 語法定義語言
    從文法規則的開始符號出發,反覆使用產生式,對非終結符進行替換或展開,最終得到的就是一種語言。

    通俗來說,一般的句子結構可以是“主語+謂語+賓語”,然後我們用產生式來替換,主語->代詞—>He,謂語->動詞->plays,賓語->名詞->piano。這樣我們就推出一句話。

    如果這樣一直重複,就可以把這種語法規則可以表示的所有語句推匯出來,即一種語言。

  10. 最左推導
    如果我們對於9中提到的產生式,每次推導都是先替換最左邊的非終結符,那就是一種最左推導。

  11. 最右推導
    如果我們對於9中提到的產生式,每次推導都是先替換最右邊的非終結符,那就是一種最左推導。

  12. 二義文法
    因為我們對於9中提到的產生式,可以通過最左推導和最右推導分別推匯出一樣的句子,所以這種文法就是二義文法。

    在程式設計語言中,只有確定化的程式碼才可以被機器按部就班執行,否則,每次機器執行結果就一定會不同。所以,程式設計語言的文法不可以是二義文法。

  13. 思考:為什麼9中提到的文法會有二義性?
    因為9中的文法未規定替換的優先順序和結合方式。

  14. 形式語言
    0型文法(短語文法)遞迴可列舉

    1型文法(上下文有關文法)

    2型文法(上下文無關文法)對應非確定的下推自動機

    3型文法(正規文法)