【问题标题】:ANTLR4 parsing error: no viable alternative at inputANTLR4 解析错误:输入时没有可行的替代方案
【发布时间】:2013-08-26 18:56:12
【问题描述】:

我的语法显然是错误的,因为解析简单文件会产生奇怪的错误消息。

我在不改变错误的情况下尽可能地简化了以下语法(如果删除 '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;
}

ANTLRWorks 2 给我以下错误信息:

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

【问题讨论】:

    标签: antlr grammar antlr4 parse-error parsing-error


    【解决方案1】:

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

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

    【讨论】:

    • 天哪,我怎么看不到?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-14
    • 1970-01-01
    • 2022-11-04
    • 2014-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多