1

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

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

1 回答 1

5

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

block
  : '{'
    (localDecl ';' | statement)*
    expr?
    '}'
  ;
于 2013-08-23T18:53:08.983 回答