我有一个规则一样,ANTLR:匹配非转义字符?
charGroup
: '[' .+ ']';
,但我想那会像[abc\]
匹配的东西。假设我希望它仅匹配未转义的]
s,我该怎么做?在正则表达式中,我会使用负面的后视。
编辑:如果可能的话,我也希望它是不真实/懒惰。以便匹配[a][b]
中的[a]
。
我有一个规则一样,ANTLR:匹配非转义字符?
charGroup
: '[' .+ ']';
,但我想那会像[abc\]
匹配的东西。假设我希望它仅匹配未转义的]
s,我该怎么做?在正则表达式中,我会使用负面的后视。
编辑:如果可能的话,我也希望它是不真实/懒惰。以便匹配[a][b]
中的[a]
。
你可能想要做这样的事情:
charGroup
: '[' ('\\' . | ~('\\' | ']'))+ ']'
;
其中~('\\' | ']')
比\
和]
其他单个字符相匹配。请注意,你只能否定单个字符!没有这样的东西~('ab')
。另一个经常犯的错误是否定解析器规则中的否定不会否定字符,而是取而代之。一个例子可能是为了:
foo : ~(A | D);
A : 'a';
B : 'b';
C : 'c';
D : ~A;
现在解析器规则foo
比赛或者令牌B
或令牌C
(所以只有字符'b'
和'c'
),而词法规则D
比赛比其他'a'
任何字符。
我会使用一个负向后看
是不是过于复杂?如何:
charGroup
: '[' ('\\]' | .)+ ']';
偷偷摸摸......把`\\``放在那里,所以它在它可以匹配```之前就吃掉了。 ANTLR中的“+”运算符是否贪婪?如果我有``[a] [b]`这样的事情,charGroup会是整个事情,还是只是`[a]`?另外,如果可能的话,我仍然喜欢使用某种否定,然后我可以把它分解成一个单独的规则,即'RBRACKET',我可以在其他地方使用它。 – mpen 2010-12-09 23:57:34
@Ralph,`+`和`*`在ANTLR中是贪婪的,除了前面有一个`.`(有些人可能会为此争论,但他们错了!它来自Terence Parr的ANTLR引用)。所以`。*`和`。+`是非贪婪的,所有其他的````和`*`* *都是*贪婪的。 – 2010-12-10 08:30:50