2013-04-03 62 views
2

默認情況下,token.getType()方法返回int,並且基於代碼很沒用,無需加載和解析生成的*.tokens文件。Antlr4創建更有意義/一致的類型名稱

ANTLR用戶通常會如何一致地使用令牌類型?我的意思是一致的是,如果你改變語法,令牌號很可能會改變。

你通常會創建一個Utility類來加載*.tokens文件並解析它嗎?

我的樣本Search.tokens文件:

LOCATION=8 
TIME=5 
AGE=3 
WS=1 
COMPARATIVE=9 
GENDER=4 
PHRASE=2 

樣本令牌流:

(token.getType(), token.getText()) 
9 [MegaBlocks vs Legos], -1 [<EOF>] 

目前我正在做這樣的事情:

public class TokenMapper { 

    private HashMap<Integer, String> tokens; 

    public TokenMapper(String file) { 
     tokens = new HashMap<Integer, String>(); 
     parse(file); 
    } 

    private void parse(String file) { 
     // trivial code that maps the Integer typeId to the String name 
    } 

    public Integer type(String type) { 
     for(Map.Entry<Integer, String> entry : tokens.entrySet()) { 
      if(entry.getValue().equals(type)) { 
       return entry.getKey(); 
      } 
     } 
     return null; 
    } 

    public String type(Integer type) { 
     return tokens.get(type); 
    } 

} 

然後,我總是可以參考我的代幣的名稱,如LOCATIONGENDER,不要h大家擔心趨勢會改變的Integer值。

回答

1

當您生成詞法分析器和/或分析器時,生成的類將包含在語法中聲明的每個標記類型的常量以及通過標記文件導入的標記類型的常量。

例如,如果您有以下語法:

lexer grammar SearchLexer; 

options { tokenVocab = Search; } 

... 

然後將生成的SearchLexer.java類將包含因爲他們由於tokenVocab選項進口常數(public static final int)爲LOCATIONGENDER

+0

哦哇,我沒有注意到! –

相關問題