2013-05-07 45 views
0

我想將一些已知的標識符名稱嵌入到我的語法中,例如我的項目的類名是已知的,我想告訴詞法分析器哪些標識符是已知的關鍵字,它們實際上屬於類名稱標記。但是由於我有很長的類名(數百個名字),我不想通過列出規則中所有已知的類名關鍵字來創建類名解析器規則,這會使我的語法文件太大。ANTLR4令牌化一大組關鍵字

是否可以將我的關鍵字放入單獨的文件中?我正在考慮的一種可能性是將關鍵字放置在將由生成的詞法分析器類進行分類的Java類中。在這種情況下,我的詞法分析器的語義謂詞可以調用自定義詞法分析器超類中的方法來驗證輸入標記是否與我長名稱列表匹配。而我的長列表可以放在超類src代碼中。

但是,在ANTLR4書中,它表示組合語法的語法選項'superClass'僅設置語法分析器的超類。如果我仍然想使用組合語法,如何設置詞法分析器的超類。或者還有沒有其他更好的方法可以將我的長關鍵字列表放入單獨的「關鍵字文件」中。

回答

1

如果你想每個關鍵字都有自己的令牌類型,你可以做到以下幾點:

  1. 一個tokens{}塊添加到語法爲每個關鍵字創建令牌。這可確保爲每個關鍵字創建獨特的標記類型。

    tokens { 
        Keyword1, 
        Keyword2, 
        ... 
    } 
    
  2. 創建類似於下面的一個單獨的類MyLanguageKeywords

    private static final Map<String, Integer> KEYWORDS = 
        new HashMap<String, Integer>(); 
    static { 
        KEYWORDS.put("keyword1", MyLanguageParser.Keyword1); 
        KEYWORDS.put("keyword2", MyLanguageParser.Keyword2); 
        ... 
    } 
    
    public static int getKeywordOrIdentifierType(String text) { 
        Integer type = KEYWORDS.get(text); 
        if (type == null) { 
         return MyLanguageParser.Identifier; 
        } 
    
        return type; 
    } 
    
  3. 添加Identifier詞法規則,以你的語法來處理關鍵字和標識符。

    Identifier 
        : [a-zA-Z_] [a-zA-Z0-9_]* 
         {_type = MyLanguageKeywords.getKeywordOrIdentifierType(getText());} 
        ;