将令牌分配给频道时,为什么会出现错误?

时间:2014-02-25 21:59:20

标签: antlr4

我的.g4文件中有以下代码。

@lexer::members{
public static final int WHITESPACE = 1;
public static final int COMMENTS = 2;
}


WS :  (' '|'\t'|'\f')+ -> channel(WHITESPACE)
   ;

COMMENT 
    :   '//' ~('\n'|'\r')* -> channel(COMMENTS)
    ;

LINE_COMMENT 
    :   '/*' .*? '*/' NEWLINE? -> channel(WHITESPACE)
    ;

我收到以下错误:

  

警告(155):Shiro.g4:239:34:规则'WS'包含带有无法识别的常量值的词法分析器命令;词法分析器可能会产生错误的输出

     

警告(155):Shiro.g4:243:38:规则'COMMENT'包含带有无法识别的常量值的词法分析器命令;词法分析器可能会产生错误的输出

     

警告(155):Shiro.g4:247:42:规则'LINE_COMMENT'包含带有无法识别的常量值的词法分析器命令;词法分析器可能会产生错误的输出

这是Terrence在ANTLR4书中描述的技术,用于将令牌放在不同的通道上。为什么我会收到这些警告?我应该担心吗?

1 个答案:

答案 0 :(得分:3)

您没有收到错误;这是一个警告。特别是,它是UNKNOWN_LEXER_CONSTANT警告,这是ANTLR 4.2的新内容。

  

编译器警告155。

     

规则' 规则'包含带有无法识别的常量值的词法分析器命令;词法分析器可能会产生错误的输出

     

词法分析器规则包含标准词法分析器命令,但该命令的常量值参数是无法识别的字符串。因此,lexer命令将被转换为自定义词法分析器操作,从而阻止命令在某些解释模式下执行。词法分析器的输出可能与生成的词法分析器的输出不匹配。

     

以下规则会产生此警告。

@members {
public static final int CUSTOM = HIDDEN + 1;
}

X : 'foo' -> channel(HIDDEN);           // ok
Y : 'bar' -> channel(CUSTOM);           // warning 155