ANTLR:匹配未转义的字符?

时间:2010-12-09 23:45:13

标签: antlr

我有一条规则,

charGroup
    : '[' .+ ']';

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

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

2 个答案:

答案 0 :(得分:2)

你可能想做类似的事情:

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

其中~('\\' | ']')匹配\]以外的单个字符。请注意,您只能否定单个字符!没有~('ab')之类的东西。经常犯的另一个错误是否定内部解析器规则不会否定一个字符,而是一个令牌。一个例子可能是顺序:

foo : ~(A | D);

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

现在,解析器规则foo匹配令牌B或令牌C(因此只有字符'b''c'),而词法分析器{{1} }匹配D以外的任何字符。

答案 1 :(得分:1)

  

我会使用负面的后视

这不是那么复杂吗?怎么样:

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