Java ANTLR 4$channel=隐藏和选项

Java ANTLR 4$channel=隐藏和选项,java,migration,antlr,antlr4,Java,Migration,Antlr,Antlr4,在决定从v3切换到v4之后,我需要有关ANTLR 4语法的帮助。我对ANTLR不是很有经验,所以如果我的问题是愚蠢的,我真的很抱歉;) 在v3中,我使用以下代码检测Java风格的注释: COMMENT : '//' ~('\n'|'\r')* '\r'? '\n' {$channel=HIDDEN;} | '/*' ( options {greedy=false;} : . )* '*/' {$channel=HIDDEN;} ; 在v4中,没有特定于规则的选项

在决定从v3切换到v4之后,我需要有关ANTLR 4语法的帮助。我对ANTLR不是很有经验,所以如果我的问题是愚蠢的,我真的很抱歉;)

在v3中,我使用以下代码检测Java风格的注释:

COMMENT
    :   '//' ~('\n'|'\r')* '\r'? '\n' {$channel=HIDDEN;}
    |   '/*' ( options {greedy=false;} : . )* '*/' {$channel=HIDDEN;}
    ;
在v4中,没有特定于规则的选项。操作(移动到隐藏通道)也无效


有人能给我一个在ANTLR v4中如何操作的提示吗?

v4的等价物如下所示:

COMMENT
    :   ( '//' ~[\r\n]* '\r'? '\n'
        | '/*' .*? '*/'
        ) -> channel(HIDDEN)
    ;
这将把所有单行和多行注释放在
隐藏频道上。但是,如果您没有使用这些
隐藏的
-标记执行任何操作,您也可以
跳过这些标记,如下所示:

COMMENT
    :   ( '//' ~[\r\n]* '\r'? '\n'
        | '/*' .*? '*/'
        ) -> skip
    ;

请注意,要告诉lexer或解析器匹配ungreedy,您不再使用
选项{greedy=false;}
,而是添加一个
,类似于许多正则表达式实现。

我现在使用您建议的代码(使用通道的第一个变体)这会引发错误:
->lexer规则“COMMENT”中的命令必须是单个最外层alt的最后一个元素
有什么问题?