Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Antlr4 为什么将令牌分配给通道时出错?_Antlr4 - Fatal编程技术网

Antlr4 为什么将令牌分配给通道时出错?

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

我的.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”包含具有无法识别的常量值的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中的模式。在这些情况下,您将无法控制分配给常量的数值。