У меня есть грамматика ANTLR для простого DSL, и все работает плавно, когда нет синтаксических ошибок. Однако теперь мне нужно поддержать механизм автозаполнения, где мне нужно получить возможные дополнения из моих древовидных грамматик, которые выполняют базовую проверку типов для атрибутов, функций и т. Д.
Проблема в том, что ANTLR не сообщает о синтаксических ошибках на локальном уровне statement
, а дальше вверх по дереву разбора, например, на уровне program
или function
. Следовательно, вместо AST, который выглядит как
program
|
function
/ | \
/ | \
stat hosed stat
Я получаю узлы мусора в верхней части дерева, поскольку ошибка, связанная с правилом statement
, «всплывает» и препятствует сопоставлению правила function
.
Есть ли способ написать правило, в котором есть предложение "catch-all", чтобы есть неожиданные токены?
Я думаю о чем-то вроде:
statement
: var_declaration
| if_statement
| for_loop
| garbage
;
garbage
: /* Match unexpected tokens, etc. (not actual statements, or closing
parens, braces, etc.). Maybe just consume one input token and let
the parser try again? */
;
В AST может быть любое количество мусорных узлов, но все до (и предпочтительно после) мусора должно быть в здравом уме.
Буду признателен за любые советы / предложения / указатели / и т. Д. Я использую ANTLR v3, Java target.