当前位置: 首页 > 知识库问答 >
问题:

ANTLR4标记大量关键字集

慕容宇
2023-03-14

共有1个答案

澹台志诚
2023-03-14

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

>

  • 向语法中添加标记{}块,为每个关键字创建标记。这可以确保为每个关键字创建唯一的标记类型。

    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;
    }
    
    Identifier
        :   [a-zA-Z_] [a-zA-Z0-9_]*
            {_type = MyLanguageKeywords.getKeywordOrIdentifierType(getText());}
        ;
    

  •  类似资料:
    • 我试图用_analyze API获得关键字标记的多字同义词。API对单字同义词返回预期结果,但对多字同义词不返回预期结果。以下是我的设置和分析链: 为什么analyze API不返回具有同义词类型的“foo bar”和“fooo bar”标记?

    • 问题内容: 在一个Java类java.util.Locale中,我发现关键字transient标记了一个方法。 有人可以告诉我为什么会这样吗? 问题答案: 不,它不能,仅对字段有效。您似乎可以通过反编译从.class获取源代码。这是反编译器错误,如果您查看src,您将看到并具有相同的值 对于字段表示,对于方法(您的情况)表示。这就是java.util.Locale src中的样子 在.class(

    • =>我不想要这种解决方案。我不是只有“DATE”作为关键字,而且我有许多使用REGULAR_WORD的规则,所以我需要在许多(20+)解析器规则中添加许多(50+)关键字,如DATE:这绝对是丑陋的。 优点:做一棵干净的树 缺点:制造肮脏的语法

    • 问题内容: 我在OCJP for Java6的书中读到了带有断言的部分。我到达了那一部分,它概述了如果将“ assert”一词用作关键字或标识符时编译器的反应。 a 和an有什么区别?谁能给我一个简单的解释,并同时给我一个或多个例子? 问题答案: 术语“关键字”和“标识符”不是Java特定的。 关键字是Java关键字列表中的保留字,可为编译器提供指令。由于保留了关键字,因此程序员不能将其用于变量或

    • 我试图让一些sql关键字作为标识符被接受,当用作标识符时。Antlr的书p210提出了这个技巧: 我也有类似的东西,但它不起作用,我想这是我的误解。是标识符的解析规则,因此: 是ident的主要lex规则。大致是这样的(这里简化了),它起作用了: 如果我给它作为输入('aaa'不是关键字),它将解析: 但是如果我给它,它就会失败--'sparse'是一个关键字: 也许我很笨,但我不明白为什么,因为

    • 问题内容: 在VB.NET中,我们可以将变量名称括在方括号中,并使用关键字作为变量名称,如下所示: 相当于C#: 我想知道是否有Java相当于这样做? 问题答案: 不可以。您可以添加下划线或类似的废话,但是基本上关键字是不可行的。