В Antlr вам нужно добавить синтаксический предикат для устранения неоднозначности, например:
grammar fred;
sentence : ( 'x' 'x' 'x' ) => 'x' sentence 'x'
| 'x'
;
Я думаю, что для этого не нужно более 1 дополнительного токена упреждения.Семантический предикат говорит: «Если вы видите« x », за которым следует другой« x », попробуйте первый вариант».
Antlr 3.3 / Antlrworks 1.4.2 доволен им:
Другим вариантом является рефакторинг вашей грамматики, чтобы исключить альтернативу, которая вводит неоднозначность:
grammar fred;
start : sentence
;
sentence : 'x' 'x'('x' 'x')* 'x'
| 'x'
;
Это, я полагаю, даст вам такое же дерево разбора (или закрыть) в качестве исходной грамматики.