Ошибка синтаксического анализа ANTLR4: на входе нет приемлемой альтернативы

У меня есть грамматика, которая явно ошибочна, так как при анализе простого файла появляются странные сообщения об ошибках.

Я максимально упростил следующую грамматику, не меняя ошибку (если вы удалите 'this' вывод GUI дерева ANTLRWorks окрашивает токен int образца файла по-разному, хотя структура кажется одинаковой).

grammar DepClsJ_no_java_debug;

module   : ( methodDecl )* ;

methodDecl   : pathType Identifier '()' block ;

pathType   : Identifier | 'this' ;

block   : '{'
    ( localDecl ';'  )*
    ( statement  )*
    ( expr  )?
    '}'   ;

localDecl   : pathType Identifier ( '=' expr )?;

statement   : block | expr ';' ;

expr   : dotExpr ( '=' dotExpr  )* ;    dotExpr   : Identifier ( '.' Identifier )* ;

Identifier   : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')* ;

Демо-код:

void main() {
    a = c;
    int b;
}

ANTLRWorks 2 выдает мне следующие сообщения об ошибках:

line 3:8 no viable alternative at input 'intb'
line 3:9 mismatched input ';' expecting '()'

1 ответ

Решение

int b; это localDeclкоторый согласно block Правило в вашей грамматике не может появиться после первого statement, Если бы вместо этого вы ослабили свою грамматику с помощью следующего, то вы могли бы использовать прослушиватель дерева разбора для выдачи значимого сообщения об ошибке после успешного разбора.

block
  : '{'
    (localDecl ';' | statement)*
    expr?
    '}'
  ;
Другие вопросы по тегам