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'|'_')* ;

演示代码:

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

ANTLRWorks2给我以下错误消息:

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

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

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

相关内容

  • 没有找到相关文章

最新更新