ANTLR4解析错误:输入时没有可行的替代方案

Bas*_*ian 1 grammar antlr parsing-error parse-error antlr4

我有一个语法显然是错误的,因为解析一个简单的文件会产生奇怪的错误信息.

我尽可能地简化了以下语法而没有改变错误(如果你删除'this'了ANTLRWorks的树gui输出,那么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'|'_')* ;
Run Code Online (Sandbox Code Playgroud)

演示代码:

void main() {
    a = c;
    int b;
}
Run Code Online (Sandbox Code Playgroud)

ANTLRWorks 2给出了以下错误消息:

line 3:8 no viable alternative at input 'intb'
line 3:9 mismatched input ';' expecting '()'
Run Code Online (Sandbox Code Playgroud)

Sam*_*ell 5

int b;是一个localDecl,根据block你的语法规则在第一个之后不能出现statement.如果您通过使用以下内容放宽了语法,那么您可以使用解析树监听器在解析成功完成后生成有意义的错误消息.

block
  : '{'
    (localDecl ';' | statement)*
    expr?
    '}'
  ;
Run Code Online (Sandbox Code Playgroud)

  • 天哪,我怎么能看不到? (2认同)