1. 程式人生 > >【編譯原理】自下而上的語法分析之LR分析法

【編譯原理】自下而上的語法分析之LR分析法

LR分析器是一種由下而上(bottom-up)的上下文無關語法分析器。LR意指由左(Left)至右處理輸入字串,並以最右邊優先派生(Right derivation)的推導順序(相對於LL分析器)建構語法樹。能以此方式分析的語法稱為LR語法。而在LR(k)這樣的名稱中,k代表的是分析時所需前瞻符號(lookahead symbol)的數量,也就是除了目前處理到的輸入符號之外,還得再向右引用幾個符號之意;省略 (k)時即視為LR(1),而非LR(0)。

由於LR分析器嘗試由分析樹的葉節點開始,向上一層層通過文法規則的化簡,最後規約回到樹的根部(起始符號),所以它是一種由下而上的分析方法。許多

程式語言使用LR(1)描述文法,因此許多編譯器都使用LR分析器分析原始碼的文法結構。LR分析的優點如下:

  • 眾多的程式語言都可以用某種LR分析器(或其變形)分析文法。(C++是個著名的例外)
  • LR分析器可以很有效率的建置。
  • 對所有“由左而右”掃描原始碼的分析器而言,LR分析器可以在最短的時間內偵測到文法錯誤(這是指文法無法描述的字串)。

然而LR分析器很難以人工的方式設計,一般使用“分析產生器(parser generator)”或“編譯器的編譯器(compiler-compiler,產生編譯器的工具)”來建構它。LR分析器可根據分析表(parsing table)的建構方式,分類為“簡單LR分析器(SLR, Simple LR parser)”、“前瞻LR分析器(LALR, Look-ahead LR parser)”以及“正統LR分析器 (Canonical LR parser)”。這些解析器都可以處理大量的文法規則,其中LALR分析器較SLR分析器強大,而正統LR分析器又比LALR分析器能處理更多的文法。著名的Yacc即是用來產生LALR分析器的工具。

以上內容來自wiki百科:http://zh.wikipedia.org/wiki/LR_%E5%88%86%E6%9E%90%E5%99%A8

================================================================

以下為LR分析法的主要內容, 截圖來源於龍書.

1. LR語法分析模型


2. LR分析演算法


3. LR(0)專案集構造


4. LR(0)專案集構造與DFA構造例項


5. SLR語法分析表構造演算法


6. LR(1)專案集構造


7. LR(1)語法分析表構造


8. LR(1)專案集與分析表例項


9. LALR分析表構造法