我有一個規則,看起來像這樣:設置類型解析值的ANTLR的
INTEGER : [0-9]+;
myFields : uno=INTEGER COMMA dos=INTEGER
眼下訪問UNO我需要代碼:
Integer i = Integer.parseInt(myFields.uno.getText())
請將我是乾淨多了可以告訴鹿角爲我做這種轉換;那麼我只需要編碼:
Integer i = myFields.uno
我的選擇是什麼?
我有一個規則,看起來像這樣:設置類型解析值的ANTLR的
INTEGER : [0-9]+;
myFields : uno=INTEGER COMMA dos=INTEGER
眼下訪問UNO我需要代碼:
Integer i = Integer.parseInt(myFields.uno.getText())
請將我是乾淨多了可以告訴鹿角爲我做這種轉換;那麼我只需要編碼:
Integer i = myFields.uno
我的選擇是什麼?
您可以將代碼編寫爲動作,但它仍然是顯式轉換(最終)。解析器(與每個解析器一樣)解析文本,然後解析「解析事件」(通過監聽器或訪問者或ANTLR4中的操作實現)來創建有意義的結構/對象。
當然,您可以擴展一些生成的或內置的類,然後直接獲取類型,但如前所述,在某些時候,您總是需要將文本轉換爲所需的某種類型。
對標記處理自定義操作的標準方法是將它們嵌入在自定義的令牌類:
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
排除手動投射自定義標記的要求。僅支持使用一種令牌標籤類型。因此,要使用多個標記類型,需要手動投射。
有沒有辦法強制這隻擴展令牌是整數? –
已更新的答案。 – GRosenberg