我對ANTLR比較陌生。我有一個非常簡單的語法:ANTLR:回溯和前瞻之間的區別?
start :
('A' 'B' 'C' '1'
|'A' 'B' 'C' '2'
|'A' 'B' 'C' '3'
)
;
我認爲,我已經明白向前看,回溯的概念(與句法斷言的作品)的基礎知識。所以這個語法適用於k = 4或者backtrack = true。但是什麼是確切的區別,主要的問題是我什麼時候使用什麼?我試圖在網上找到答案,但沒有成功。
我對ANTLR比較陌生。我有一個非常簡單的語法:ANTLR:回溯和前瞻之間的區別?
start :
('A' 'B' 'C' '1'
|'A' 'B' 'C' '2'
|'A' 'B' 'C' '3'
)
;
我認爲,我已經明白向前看,回溯的概念(與句法斷言的作品)的基礎知識。所以這個語法適用於k = 4或者backtrack = true。但是什麼是確切的區別,主要的問題是我什麼時候使用什麼?我試圖在網上找到答案,但沒有成功。
我在「Definitve Antlr Reference」一書中找到了對我的問題的理論描述,這對我的理解也很重要。也許有些自問自己類似問題的人也會幫助這本書的一小部分。
頁262
您的語法在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)的其他原因。
謝謝。我會試着用遞歸規則來更好地理解它。但現在我有一個想法。謝謝。 – Veilchen4ever
你能解釋第二個遞歸的例子嗎?因爲我認爲這不是一個左遞歸規則,ANTLR應該能夠處理它嗎? –