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