我有这样的规则,
BLOCK_COMMENT
: ('/*' ~[!] .*? '*/' | '/**/') -> channel(HIDDEN);
但是当我尝试匹配这一行时,
/**/and /**/1=1
and
符号也是HIDDEN。由于ANTLR是贪婪的,它与最后一次出现的*/
匹配,最终只有一个BLOCK_COMMENT(我期待两个)
所以,我需要一些匹配not '*/'
的东西,BLOCK_COMMENT规则应该成为:
'/*'
然后'*/'
然后'*/'
任何人都知道哪些规则可以匹配not '*/'
?
答案 0 :(得分:0)
首先,这是关于词法规则的~
运算符上的“权威ANTLR4参考”一书的引用:
~x匹配不在x描述的集合中的任何单个字符。设置x 可以是单个字符文字,范围或子集等 〜('x'|'y'|'z')或〜[xyz]。
基本上我们不能使用像~'*/'
这样的东西。
既然你需要解释自己的评论,最好的方法就是用词法模式进行恕我直言。
...
COMMENT_START : '/*' -> mode (COMMENT_MODE);
mode COMMENT_MODE;
COMMENT_END : '*/' -> mode (DEFAULT_MODE);
//match anything else that you need in this mode
...
我假设除了默认模式之外你只有一种模式。当然,如果你有更多这些,你也可以使用popMode
和pushMode
。