ANTLR4标记了大量关键字

ANTLR4标记了大量关键字,antlr4,Antlr4,我想在语法中嵌入一些已知的标识符名称,例如,我的项目的类名是已知的,我想告诉lexer哪些标识符是实际属于类名令牌的已知关键字。但是由于我有一个很长的类名列表(数百个名称),我不想通过在规则中列出所有已知的类名关键字来创建类名lexer规则,这会使我的语法文件太大 是否可以将我的关键字放在一个单独的文件中?我考虑的一种可能性是将关键字放在一个java类中,该类将由生成的lexer类进行子类化。在这种情况下,我的lexer的语义谓词可以只调用自定义lexer超类中的一个方法,以验证输入标记是否与我

我想在语法中嵌入一些已知的标识符名称,例如,我的项目的类名是已知的,我想告诉lexer哪些标识符是实际属于类名令牌的已知关键字。但是由于我有一个很长的类名列表(数百个名称),我不想通过在规则中列出所有已知的类名关键字来创建类名lexer规则,这会使我的语法文件太大

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


然而,在ANTLR4的书中,它说组合语法的语法选项“超类”只设置解析器的超类。如果我仍然想使用组合语法,如何设置lexer的超类。或者有没有其他更好的方法将我的长关键字列表放入一个单独的“关键字文件”中。

如果您希望每个关键字都有自己的令牌类型,可以执行以下操作:

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;
}
  • tokens{}
    块添加到语法中,为每个关键字创建标记。这确保为每个关键字创建唯一的令牌类型

    tokens {
        Keyword1,
        Keyword2,
        ...
    }
    
  • 创建一个单独的类
    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;
    }