Java ANTLR 4$channel=隐藏和选项
在决定从v3切换到v4之后,我需要有关ANTLR 4语法的帮助。我对ANTLR不是很有经验,所以如果我的问题是愚蠢的,我真的很抱歉;) 在v3中,我使用以下代码检测Java风格的注释: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中,没有特定于规则的选项
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的最后一个元素
有什么问题?