Ошибка синтаксического анализа 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?
'}'
;