2011-11-27 75 views

回答

23

否定可以在裏面lexer and parser rules發生。

內部詞法規則,你可以否定字符,語法規則裏面,你可以否定令牌(詞法規則)。但是詞法分析器和分析器規則只能分別否定單個字符或單個標記。

幾個例子:

詞法規則

要匹配除了小寫ASCII字母一個或多個字符,你可以這樣做:

NO_LOWERCASE : ~('a'..'z')+ ; 

(否定-元字符, ~,優先級高於+,所以上述規則等於(~('a'..'z'))+

注意'a'..'z'匹配單個字符(可以爲此被否定),但下面的規則是無效的:

ANY_EXCEPT_AB : ~('ab') ; 

因爲'ab'(顯然)匹配2個字符,也不能否定。爲了匹配由2個字符的道理,但不是'ab',你必須做到以下幾點:

ANY_EXCEPT_AB 
    : 'a' ~'b' // any two chars starting with 'a' followed by any other than 'b' 
    | ~'a' . // other than 'a' followed by any char 
    ; 

語法規則

裏面的語法規則,~否定一定道理,或一個以上令牌。例如,您有以下標記定義:

A : 'A'; 
B : 'B'; 
C : 'C'; 
D : 'D'; 
E : 'E'; 

如果你現在想匹配任何令牌除了A,你這樣做:

p : ~A ; 

如果你想匹配任何令牌除了BD,你可以這樣做:

p : ~(B | D) ; 

但是,如果你想匹配比A其他任何兩個令牌隨後B,你不能做:

p : ~(A B) ; 

正如詞法規則,你不能否定多單令牌等等。爲了實現上述情況,你需要做的:

P 
    : A ~B 
    | ~A . 
    ; 

注意,在解析器規則.(DOT)字符不比賽,因爲它確實詞法規則內的任何字符。裏面的語法規則,它的任何令牌(ABCDE,在這種情況下)相匹配。

注意,你不能否定的語法規則。以下是非法的:

p : ~a ; 
a : A ; 
+0

感謝您的澄清。我不知道在解析器規則中出現'〜'運算符會應用於標記。 – Gunther

+0

@Gunther,沒問題。我經常在我的答案中提到它,所以從現在起我可以鏈接到這個問答。 W.r.t.你的轉換器,也許你已經在使用它,但可能不是:'org.antlr.tool.Strip'類從ANTLR語法文件中刪除所有的自定義代碼,這可能會讓你在解析ANTLR語法時更容易。 –