【问题标题】:Antlr4, mismatched input error: the token is not recognizedAntlr4,输入不匹配错误:无法识别令牌
【发布时间】:2022-12-09 00:32:16
【问题描述】:

我有以下 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: [ \t\r\n]+ -> channel(HIDDEN);

我希望我的语法可以接受这样的输入数据:

protected static final int test = 10;

但是我收到以下错误。

line 1:0 mismatched input 'protected' expecting {MODIFIER, NAME}

尽管令牌'protected'绝对应该被规则MODIFIER接受

【问题讨论】:

    标签: parsing antlr antlr4


    【解决方案1】:

    规则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';
    

    【讨论】:

      猜你喜欢
      • 2021-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-17
      • 1970-01-01
      • 2013-08-23
      相关资源
      最近更新 更多