剖析表是剖析器(parser)的一部分,用來幫助剖析器作某些決定,並且告訴編譯器之後要怎樣處理輸入的符記(token)。
基本介紹
- 中文名:剖析表
- 學科:計算機
概觀,LR分析器,LL分析器,
概觀
剖析表是一個告訴剖析器在特定狀態下,遇到特定輸入時需要作什麼動作的一張表。一般可以視為是一個用表格表示的下推自動機,這裡的下推式自動機是根據要被剖析的語言其上下文無關語法而設計。
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分析器的工具。
LL分析器
LL分析器是一種處理某些上下文無關文法的自頂向下分析器。因為它從左(Left)到右處理輸入,再對句型執行最左推導出語法樹(Leftderivation,相對於LR分析器)。能以此方法分析的文法稱為LL 文法。
本文中將討論表格驅動的分析器,而非通常由手工打造(非絕對,參看如ANTLR等的 LL(*) 遞歸下降分析器生成器)的遞歸下降分析器。