編譯器實現(三)

1. 上下文無關文法及分析

上下文無關文法的規則是遞歸的。正則表達式

識別這些結構的算法使用遞歸調用或顯示管理的分析棧。常用的基本結構是一類樹(分析樹或語法樹)。算法

算法大體可分爲兩種:自頂向下和由底向上數組

1.1 分析過程

分析函數將掃描程序生成的記號序列做爲輸入,並生成語法樹做爲輸出:函數

  1. 編譯器中更可能是多遍,後面的遍將語法樹做爲他們的輸入。
  2. 語法樹的結構很大程度依賴語言特定的語法結構。
  3. 錯位處理,恢復繼續分析。

1.2 上下文無關文法

同正則表達式相似,文法規則是定義在一個字母表或符號集之上。spa

1.2.1 上下文無關文法規則

文法規則:.net

exp → exp op exp | (exp) | number
op → + | - | * 

  第1個規則定義了一個表達式結構(用名字e x p)由帶有一個算符和另外一個表達式的表達式,或一個位於括號之中的表達式,或一個數組成。第2個規則定義一個算符(利用名字o p)由符號+、-或*構成。翻譯

還有其餘各類變形形式:3d

1.code

2.blog

3.

4.

1.2.2 推導及由文法定義的語言

文法規則經過推導肯定記號符號的正規串。推導 是在文法規則的右邊進行選擇的一個結構名字替換序列。推導以一個結構名字開始並以記號符號串結束。在推導的每個步驟中,使用來自文法規則的選擇每一次生成一個替換。

例:由文法規則進行推導

由推導從exp符號中獲得的全部記號符號的串集是被表達式的文法定義的語言。

推導的結果集合記爲:

  

其中G表明表達式文法,s 表明記號符號的任意數組串(有時稱爲句子 ),而符號⇒*表示由如前所述的替換序列組成的推導(星號用做指示步驟的序列,這與在正則表達式中指示重複很相像)。因爲它們經過推導「產生」 L (G)中的串,文法規則所以有時也稱做產生式 。

終結符,通俗的說就是不能單獨出如今推導式左邊的符號,也就是說終結符不能再進行推導
不是終結符的都是非終結符。非終結符可理解爲一個可拆分元素,而終結符是不可拆分的最
小元素。如:有α → β ,則α 必然是個非終結符。通常書上把非終結符用大寫字母表示,而
終結符用小寫字母表示。識別符號就是開始符。由文法產生語言句子的基本思想是:從識別符
號開始,把當前產生的符號串中的非終結符號替換爲相應規則右部的符號串,直到最終全由終
結符號組成。這種替換過程稱爲推導或產生句子的過程,每一步成爲直接推導或直接產生。 例如: 有文法G2[S]爲: S
->Ap S->Bq A->a A->cA B->b B->dB 則表示:S 爲開始符,S,A,B 爲非終結符,而p,q,a,b,c,d 爲終結符

 

 

1.3 分析樹與抽象語法樹

1.3.1 分析樹

與推導相對應的分析樹是一個做了標記的樹,其內部的結點由非終結符標出,樹葉節點由終結符標出,每一個子節點都表示推導的一個步驟中的相關非終結符的替換。

例:

  

通常而言,分析樹可與許多推導相對應。
最左推導
    是指它的每一步中最左的非終結符都要被替換的推導。與其相關的分析樹的內部節點的前序編號相對應。
最右推導
    則是指它的每一步中最右的非終結符都要被替換的推導。最右推導則和後序編號相對應。

 

 

1.3.2 抽象語法樹

分析樹包含了比純粹生成可執行代碼所需更多的信息。抽象語法樹去除了獲得記號序列的分析過程,但包含了轉換所需的全部信息,是真正的源代碼記號序列的抽象表示。

        

     分析樹         

   抽象語法樹

 1.4 二義性

分析樹和語法樹惟一地表達着語法結構,它們與表達最左和最右推導同樣,但並非對於全部推導均可以。不幸的是,文法有可能容許一個串有多於一個的分析樹。例如在前面做爲標準示例的簡單整型算術文法中

  exp → exp op exp | ( exp ) | n u m b e r
  op → + | - | *
和串3 4 - 3 * 4 2,這個串有兩個不一樣的分析樹:

  

有兩個解決二義性的基本方法。

其一是:設置一個規則,該規則可在每一個二義性狀況下指出哪個分析樹(或語法樹)是正確的。這樣的規則稱做消除二義性規則(disambiguating rule)。這樣的規則的用處在於:它無需修改文法(可能會很複雜)就可消除二義性;它的缺點在於語言的語法結構不再能由文法單獨提供了。

另外一種方法是將文法改變成一個強制正確分析樹的構造的格式,這樣就能夠解決二義性了。固然在這兩種辦法中,都必須肯定在二義性狀況下哪個樹是正確的。這就再一次涉及到語法制導翻譯原則了。咱們所需的分析(或語法)樹應可以正確地反映未來應用到構造的意義,以便將其翻譯成目標代碼。

 

優先權和結合性

爲了處理文法中的運算優先權問題,就必須把具備相同優先權的算符概括在一組中,併爲每一種優先權規定不一樣的規則。

  

 

else懸掛問題

  例:文法:因爲可選的else的影響,這個文法有二義性。

      

  對:if (0) if (1) other else other  有兩個分析樹:

    

 

  解決:

    

 

1.5 擴展的表示法:EBNF和語法圖

EBNF:參考:https://blog.csdn.net/cfy_qiangkeming/article/details/83288555

擴展的BNF,包含了重複和可選的結構。

重複:

  重複是由文法規則中的遞歸表達,可能使用了左遞歸或右遞歸,通常規則:

    

  其中:α和β是終結符和非終結符的任意串,且在第1個規則中β不以A開始,在第2個規則中β不以A結束。

 


語法圖

  用做可視地表示E B N F規則的圖形表示法稱做語法圖( syntax diagram)。它們是由表示結符非終結符的方框、表示序列和選擇的帶箭頭的線,以及每個表示文法規則定義該非終結符的圖表的非終結符標記組成。圓形框和橢圓形框用來指出圖中的終結符,而方形框和矩形框則用來指出非終結符。

  

 

1.6 上下文無關語言的形式特徵

1.6.1 形式定義

定義  上下文無關文法由如下各項組成:
1) 終結符(terminal)集合T2) 非終結符(nonterminal)集合N(與T不相交)。3) 產生式(production)或文法規則(grammar rule)A→a的集合P,其中A是N的一個
元素,a是(T ∪ N)*中的一個元素(是終結符和非終結符的一個可爲空的序列)。
4) 來自集合N的開始符號(start symbol)。

 

文法G上的分析樹( parse tree)是一個帶有如下屬性的做了標記的樹:

1) 每一個節點都用終結符、非終結符或 標出。

2) 根節點用開始符號S標出。

3) 每一個葉節點都用終結符或ε標出。

4) 每一個非葉節點都用非終結符標出。

5) 如帶有標記A∈N的節點有n 個帶有標記X1, X2, . . . Xn 的孩子(能夠是終結符也能夠是非終結符),就有A→X1 , X2 , . . . Xn ∈P(文法的一個產生式)。

 

若上下文無關文法G有L=L(G),就將串L的集合稱做上下文無關語言。若存在串w∈ L (G),其中w 有兩個不一樣的分析樹(或最左推導或最右推導),那麼文法G就有二義性。

相關文章
相關標籤/搜索