0

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

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

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

4

1 回答 1

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());}
        ;
    
于 2013-05-07T13:17:33.970 回答