对一组巨大的关键字进行令牌化的ANTLR4

时间:2013-05-07 13:00:01

标签: antlr4

我想在我的语法中嵌入一些已知的标识符名称,例如我的项目的类名是已知的,我想告诉词法分析器哪些标识符是实际属于类名称标记的已知关键字。但由于我有一长串的类名(数百个名字),我不想通过在规则中列出所有已知的类名关键字来创建类名词法律规则,这将使我的语法文件也成为大。

是否可以将我的关键字放入单独的文件中?我正在考虑的一种可能性是将关键字放在一个java类中,该类将由生成的lexer类进行子类化。在这种情况下,我的词法分析器的语义谓词只需调用自定义词法分析器超类中的方法来验证输入标记是否与我的长名称列表匹配。我的长列表可以放在超类src代码中。

然而,在ANTLR4的书中,它说语法选项' superClass'对于组合语法,只设置解析器的超类。如果我仍然想要使用组合语法,我如何设置我的词法分析器的超类。或者还有其他更好的方法可以将我长长的关键字列表放入单独的"关键字文件"。

1 个答案:

答案 0 :(得分: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());}
        ;