2014-02-25 39 views
3

我的.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书中描述的将令牌放在不同通道上的技术。为什么我会收到这些警告?我应该担心吗?

回答

3

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

编译器警告155

规则“规则”包含具有一个无法识别的恒定值的词法分析器命令;词法分析器可能产生不正确的输出

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

以下规则会产生此警告。

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

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

你是对的。这是我的错误。我应该叫它警告。什么是“词法解释器的输出可能与生成的词法分析器的输出不匹配”。意思? –

+0

@ 280Z28如果我明确设置了'public static final int CUSTOM = 2;',我可以忽略这个警告吗? – petrbel

+1

@petrbel不,在这种情况下,ANTLR代码生成器在代码生成时仍然不知道常量的值,这意味着警告仍然有效。当前抑制警告的唯一方法是在名为'CUSTOM'的词法分析器中定义一个标记(在'tokens {}'块中)或一个模式。在这些情况下,您无法控制分配给该常量的数字值。 –