2013-05-07 52 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());} 
        ;