我有一個規則一樣,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