Antlr4 为什么将令牌分配给通道时出错?
我的.g4文件中有以下代码Antlr4 为什么将令牌分配给通道时出错?,antlr4,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
@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”包含具有无法识别的常量值的lexer命令;lexer解释器可能产生不正确的输出
警告(155):Shiro.g4:243:38:规则“COMMENT”包含具有无法识别的常量值的lexer命令;lexer解释器可能产生不正确的输出
警告(155):Shiro.g4:247:42:规则“LINE_COMMENT”包含一个带有无法识别的常量值的lexer命令;lexer解释器可能产生不正确的输出
这是Terrence在ANTLR4书中描述的将令牌放在单独通道上的技术。为什么我会收到这些警告?我应该担心吗?您没有收到错误;这是一个警告。尤其是警告,这是ANTLR 4.2中新增的 编译器警告155 规则“rule”包含具有无法识别的常量值的lexer命令;lexer解释器可能产生不正确的输出 lexer规则包含标准lexer命令,但该命令的常量值参数是无法识别的字符串。因此,lexer命令将被转换为自定义lexer操作,从而阻止该命令在某些解释模式下执行。lexer解释器的输出可能与生成的lexer的输出不匹配 以下规则产生此警告
@members {
public static final int CUSTOM = HIDDEN + 1;
}
X : 'foo' -> channel(HIDDEN); // ok
Y : 'bar' -> channel(CUSTOM); // warning 155
你是对的。那是我的错误。我应该称之为警告。“lexer解释器的输出可能与生成的lexer的输出不匹配”是什么意思?@280Z28如果我明确地设置
public static final int CUSTOM=2,我可以忽略这个警告吗代码>???@petrbel否,在这种情况下,ANTLR代码生成器在生成代码时仍然不知道常量的值,这意味着警告仍然有效。当前抑制警告的唯一方法是定义一个标记(在tokens{}
块中)或名为CUSTOM
的lexer中的模式。在这些情况下,您将无法控制分配给常量的数值。