2016-05-09 46 views
1

我有一個規則,看起來像這樣:設置類型解析值的ANTLR的

INTEGER : [0-9]+; 
myFields : uno=INTEGER COMMA dos=INTEGER 

眼下訪問UNO我需要代碼:

Integer i = Integer.parseInt(myFields.uno.getText()) 

請將我是乾淨多了可以告訴鹿角爲我做這種轉換;那麼我只需要編碼:

Integer i = myFields.uno 

我的選擇是什麼?

回答

1

您可以將代碼編寫爲動作,但它仍然是顯式轉換(最終)。解析器(與每個解析器一樣)解析文本,然後解析「解析事件」(通過監聽器或訪問者或ANTLR4中的操作實現)來創建有意義的結構/對象。
當然,您可以擴展一些生成的或內置的類,然後直接獲取類型,但如前所述,在某些時候,您總是需要將文本轉換爲所需的某種類型。

0

對標記處理自定義操作的標準方法是將它們嵌入在自定義的令牌類:

public class MyToken extends CommonToken { 
    .... 
    public Integer getInt() { 
     return Integer.parseInt(getText()); // TODO: error handling 
    } 
} 

還可以創建

public class MyTokenFactory extends TokenFactory { .... } 

到源代碼自定義標記。使用Lexer#setTokenFactory()將工廠添加到詞法分析器。

在自定義TokenFactory,覆蓋的方法

Symbol create(int type, String text); // (typically override both factory methods) 

構建並返回一個新MyToken

鑑於簽名包括目標令牌類型type,可以返回自定義類型特定的令牌子類,每個子類都有自己的自定義方法。

幾個問題,但這。首先,在實踐中,它不是通常需要:分配VAR是靜態類型,以便在該OP例如,

options { TokenLabelType = "MyToken"; } 

Integer i = myFields.uno.getInt(); // no cast required 

如果整數需要&預計,使用getInt()。如果布爾...

其次,ANTLR選項允許設置TokenLabelType排除手動投射自定義標記的要求。僅支持使用一種令牌標籤類型。因此,要使用多個標記類型,需要手動投射。

+0

有沒有辦法強制這隻擴展令牌是整數? –

+0

已更新的答案。 – GRosenberg