ANTLR: разница между backtrack и look-ahead?

I относительно новый для ANTLR. У меня очень простая грамматика:

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

Я думаю, что я уже понимаю основы концепции look ahead и backtracking (которая работает с синтаксическими предикатами). Таким образом, эта грамматика работает с k=4 или с backtrack=true. Но в чем разница, и главный вопрос в том, когда я использую что? я пытался найти ответ в интернете, но не получилось.

2 ответов


ваша грамматика работает в ANTLR v3 без каких-либо опций.

опция k ограничивает ANTLR классическим анализом LL(k). Backtracking означает-если парсер не может предсказать, какое правило использовать, он просто пытается, возвращается и пытается снова. Опция backtracking, которую вы должны использовать, когда ANTLR не может построить look-ahead DFA для данной грамматики. ANTLR v3 может создавать DFAs из регулярных выражений довольно легко, но у него есть свои трудности с рекурсивными правилами. Например, эта грамматика работает:

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).


Я нашел теоретическое описание моего вопроса в книге "The definitve Antlr Reference", что также было важно для моего понимания. Возможно, некоторые другие, которые задают себе подобный вопрос, также помогут этому фрагменту книги.

Snippet from the Book "The definitive Antlr Reference"

страница 262