Допуск неправильных операторов с помощью ANTLR (например, для завершения кода) - PullRequest
1 голос
/ 12 ноября 2009

У меня есть грамматика 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.

1 Ответ

1 голос
/ 12 ноября 2009

Взгляните на http://www.antlr.org/wiki/display/ANTLR3/Error+reporting+and+recovery

Кстати: если вы нацелены на затмение, вы должны посмотреть на xtext (http://www.eclipse.org/Xtext/) - он основан на ANTLR 3 и генерирует хороший редактор с подсветкой синтаксиса и поддержкой кода.

...