antlr反向短语匹配问题

时间:2016-11-03 07:03:49

标签: antlr antlr4

我有这样的规则,

BLOCK_COMMENT
    : ('/*' ~[!] .*? '*/' | '/**/') -> channel(HIDDEN);

但是当我尝试匹配这一行时,

/**/and /**/1=1

and符号也是HIDDEN。由于ANTLR是贪婪的,它与最后一次出现的*/匹配,最终只有一个BLOCK_COMMENT(我期待两个)

所以,我需要一些匹配not '*/'的东西,BLOCK_COMMENT规则应该成为:

'/*'然后'*/'然后'*/'

任何人都知道哪些规则可以匹配not '*/'

1 个答案:

答案 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
...

我假设除了默认模式之外你只有一种模式。当然,如果你有更多这些,你也可以使用popModepushMode