2010-12-09 84 views
1

我有一个规则一样,ANTLR:匹配非转义字符?

charGroup 
    : '[' .+ ']'; 

,但我想那会像[abc\]匹配的东西。假设我希望它仅匹配未转义的] s,我该怎么做?在正则表达式中,我会使用负面的后视。

编辑:如果可能的话,我也希望它是不真实/懒惰。以便匹配[a][b]中的[a]

回答

2

你可能想要做这样的事情:

charGroup 
    : '[' ('\\' . | ~('\\' | ']'))+ ']' 
    ; 

其中~('\\' | ']')\]其他单个字符相匹配。请注意,你只能否定单个字符!没有这样的东西~('ab')。另一个经常犯的错误是否定解析器规则中的否定不会否定字符,而是取而代之。一个例子可能是为了:

foo : ~(A | D); 

A : 'a'; 
B : 'b'; 
C : 'c'; 
D : ~A; 

现在解析器规则foo比赛或者令牌B或令牌C(所以只有字符'b''c'),而词法规则D比赛比其他'a'任何字符。

1

我会使用一个负向后看

是不是过于复杂?如何:

charGroup 
    : '[' ('\\]' | .)+ ']'; 
+0

偷偷摸摸......把`\\``放在那里,所以它在它可以匹配```之前就吃掉了。 ANTLR中的“+”运算符是否贪婪?如果我有``[a] [b]`这样的事情,charGroup会是整个事情,还是只是`[a]`?另外,如果可能的话,我仍然喜欢使用某种否定,然后我可以把它分解成一个单独的规则,即'RBRACKET',我可以在其他地方使用它。 – mpen 2010-12-09 23:57:34

+1

@Ralph,`+`和`*`在ANTLR中是贪婪的,除了前面有一个`.`(有些人可能会为此争论,但他们错了!它来自Terence Parr的ANTLR引用)。所以`。*`和`。+`是非贪婪的,所有其他的````和`*`* *都是*贪婪的。 – 2010-12-10 08:30:50