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