如何在 ANTLR4 中实现这个规则?

How to implement this rule in ANTLR4?

如何在 ANTLR4 中实现此规则:

multiline-comment-text-item -> Any Unicode scalar value except /* or */

在 ANTLR 中,你不能说:"match this-or-that character, except these multiple (!) characters"。你只能说 "match this-or-that character, except these single (!) characters":

ANY_EXCEPT_STAR : ~[*];
ANY_EXCEPT_FSLASH : ~[/];

但是 FOO : ~[/*]; 匹配除 /* 之外的任何单个字符。

我不会在它自己的词法分析器规则中匹配 multiline-comment-text-item,而是在 multiline-comment-text 中(最有可能)使用它的地方:

MultilineCommentText
 : '/*' .*? '*/'
 ;

一定要在其中包含 ?,使其不受欢迎。

请注意,此类标记经常被隐藏或丢弃,因此它们不会出现在解析器规则中。在这种情况下,请执行以下任一操作:

MultilineCommentText
 : '/*' .*? '*/' -> skip
 ;

MultilineCommentText
 : '/*' .*? '*/' -> channel(HIDDEN)
 ;

参见:https://github.com/antlr/antlr4/blob/master/doc/lexer-rules.md

我在尝试使用 ANTLR4 解析 Swift 时遇到了这条规则。以下是我的实现:

MULTILINE_COMMENT
    : '/*' ('/'*? MULTILINE_COMMENT | ('/'* | '*'*) ~[/*])*? '*'*? '*/'
;

没有必要像文档中那样将multiline-comment拆分成那么多子规则。