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", что также было важно для моего понимания. Возможно, некоторые другие, которые задают себе подобный вопрос, также помогут этому фрагменту книги.
страница 262