2010-10-15 57 views
5

我想創建'..'在ANTLR3詞法分析器一個令牌,該令牌將被用來串這樣的表達式ANTLR3詞法優先

a..b  // [1] 
c .. x // [2] 
1..2  // [3] 
3 .. 4 // [4] 

所以,我已經加入,

DOTDOTSEP : '..' 
      ; 

的問題是我已經有一個規則:

FLOAT : INT (('.' INT (('e'|'E') INT)? 'f'?) | (('e'|'E') INT)? ('f')) 
     ; 

而在上面的示例[3] 1..2我作爲一個FLOAT(我不知道爲什麼,因爲繼第一個.是另一個.不是INT,但它是)。

我不知道是否有辦法改變詞法分析規則的優先級,所以DOTDOTSEP首先匹配,然後FLOAT

看起來here看來我輸了,"The rule having the greatest count is the winner.",,但不知道是否有解決方法。

P.S. INT的定義如下...

fragment DIGIT 
    : '0'..'9' 
    ; 

INT : DIGIT+ 
    ; 

編輯。 稍微進一步的測試讓我覺得它不像它直接匹配FLOAT規則那麼簡單。 (我想改變這個問題,但是因爲我現在已經有了答案,所以我不會這樣做)。問題(我相信)仍然存在於詞法分析規則優先級中,所以問題仍然是一樣的。

回答

7

你看過http://sds.sourceforge.net/src/antlr/doc/lexer.html嗎?

一個可能的解決方案是定義如下:

fragment 
INT : DIGIT+ 
    ; 

fragment 
RANGE : INT DOTDOTSEP INT 
     ; 

fragment 
FLOAT : INT (('.' INT (('e'|'E') INT)? 'f'?) | (('e'|'E') INT)? ('f')) 
     ; 

NUMBER 
    : (INT '.') => FLOAT  { $type=FLOAT; } 
    | (INT DOTDOTSEP) => RANGE { $type=RANGE; } 
    | INT      { $type=INT; } 
    ; 
+0

這讓我非常接近,只是一點點更多的調整需要。我沒有找到的鏈接,但看起來很棒;只是我應該閱讀的東西,所以我現在就要去做。謝謝。 – tjm 2010-10-15 13:59:24

+0

我現在很好,只是幾個筆記給其他任何人可能會來此。在ANTLRWorks v1.4中,解釋器無法處理謂詞,所以在沒有(這會減慢我的速度)的時候看起來有錯誤,而且我必須將'$ settype(TYPE);'更改爲' $ type = TYPE;' – tjm 2010-10-15 16:06:50

+0

@tjm,我稍微編輯了ANTLR示例。它現在是v3兼容嗎? – 2010-10-15 18:01:29