我有一个语法,它显然是错误的,因为解析一个简单的文件会产生奇怪的错误消息。
在不改变错误的情况下,我尽可能简化了以下语法(如果删除'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?
'}'
;