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

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

Я максимально упростил следующую грамматику, не изменив ошибку (если вы удалите 'this', вывод дерева графического интерфейса 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 '()'

person Bastian    schedule 23.08.2013    source источник


Ответы (1)


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

block
  : '{'
    (localDecl ';' | statement)*
    expr?
    '}'
  ;
person Sam Harwell    schedule 23.08.2013
comment
ОМГ, как я мог этого не видеть? - person Bastian; 24.08.2013