2012-11-16 61 views
6

我對ANTLR比較陌生。我有一個非常簡單的語法:ANTLR:回溯和前瞻之間的區別?

start : 
('A' 'B' 'C' '1' 
|'A' 'B' 'C' '2' 
|'A' 'B' 'C' '3' 
) 
; 

我認爲,我已經明白向前看,回溯的概念(與句法斷言的作品)的基礎知識。所以這個語法適用於k = 4或者backtrack = true。但是什麼是確切的區別,主要的問題是我什麼時候使用什麼?我試圖在網上找到答案,但沒有成功。

回答

1

我在「Definitve Antlr Reference」一書中找到了對我的問題的理論描述,這對我的理解也很重要。也許有些自問自己類似問題的人也會幫助這本書的一小部分。

Snippet from the Book "The definitive Antlr Reference"

頁262

3

您的語法在ANTLR v3中沒有任何選項。

k選項將ANTLR限制爲傳統的LL(k)解析。回溯意味着 - 如果解析器無法預測,使用哪個規則,它只會嘗試,回溯並再次嘗試。 當ANTLR無法爲給定語法構建預見DFA時,應使用回溯選項。 ANTLR v3可以很容易地從正則表達式構建DFA,但它在遞歸規則方面有困難。例如,這個語法的工作原理如下:

start: recursive_rule ';' 
    | recursive_rule ':' 
    ; 

recursive_rule : (ID)* '%' 
       ; 

下面這個語法是一樣的,但是通過遞歸表達。 ANTLR不能建立DFA吧(其實我不知道爲什麼),所以你需要切換出爾反爾:

start options {backtrack=true;} : recursive_rule ';' 
           | recursive_rule ':' 
           ; 

recursive_rule : ID recursive_rule 
       |'%' 
       ; 

第k選項用於提高性能分析器。我不知道將LL(*)限制爲LL(k)的其他原因。

+0

謝謝。我會試着用遞歸規則來更好地理解它。但現在我有一個想法。謝謝。 – Veilchen4ever

+0

你能解釋第二個遞歸的例子嗎?因爲我認爲這不是一個左遞歸規則,ANTLR應該能夠處理它嗎? –