我有以下ANTLR语法:
declareField : MODIFIER* typeVar nameType ASSIGN value ';';
nameType : NAME(('.')NAME)*;
typeVar : nameType | nameType'<'typeVar'>' | typeVar'['']';
value : PRIMITIVE_VALUE;
和这样一组符号:
ASSIGN : '=';
NULL : 'null';
INT : [0-9]+;
FLOAT : [0-9]+.[0-9]+;
STRING : '"'[a-zA-Z_0-9.]*'"';
CHAR : '''[a-zA-Z_0-9]''';
BOOLEAN : TRUE | FALSE;
TRUE : 'true';
FALSE : 'false';
PRIMITIVE_VALUE : INT | FLOAT | STRING | CHAR | BOOLEAN | NULL;
PUBLIC : 'public';
PRIVATE : 'private';
FINAL : 'final';
STATIC : 'static';
VOLATILE : 'volatile';
TRANSIENT : 'transient';
SYNCHRONIZED : 'synchronized';
NATIVE : 'native';
ABSTRACT : 'abstract';
PROTECTED : 'protected';
MODIFIER : PUBLIC | PRIVATE | FINAL | STATIC | VOLATILE | TRANSIENT | SYNCHRONIZED | NATIVE | ABSTRACT | PROTECTED;
NAME : [a-zA-Z_][a-zA-Z_0-9]*;
WS: [ trn]+ -> channel(HIDDEN);
我希望我的语法能接受这样的输入数据:
protected static final int test = 10;
但是我得到以下错误:
line 1:0 mismatched input 'protected' expecting {MODIFIER, NAME}
尽管令牌'protected'
必须被规则MODIFIER
所接受
规则MODIFIER
将永远不匹配,因为构成MODIFIER
的所有规则都在MODIFIER
之前匹配。
将其改为解析器规则:
declareField : modifier* typeVar nameType ASSIGN value ';';
...
modifier : PUBLIC | PRIVATE | FINAL | STATIC | VOLATILE | TRANSIENT | SYNCHRONIZED | NATIVE | ABSTRACT | PROTECTED;
PUBLIC : 'public';
PRIVATE : 'private';
FINAL : 'final';
STATIC : 'static';
VOLATILE : 'volatile';
TRANSIENT : 'transient';
SYNCHRONIZED : 'synchronized';
NATIVE : 'native';
ABSTRACT : 'abstract';
PROTECTED : 'protected';