【问题标题】:How to extract keywords from antlr lexer如何从 antlr 词法分析器中提取关键字
【发布时间】:2020-01-23 15:04:27
【问题描述】:

我正在用 Java 为我没有编写的语法构建一个文本编辑器,我希望支持语法高亮显示。我有一个包含关键字的词法分析器文件(以下是一个子集):

DATABASE: 'DATABASE';
NATIVE: 'NATIVE' -> mode(NATIVE_QUERY);
SOURCE: 'SOURCE';
CHECK: 'CHECK';
ACTION: 'ACTION';
EXECUTE: 'EXECUTE';
USING: 'USING';
ON: 'ON';
EACH: 'EACH';
FROM: 'FROM';

我想动态读取这些关键字,以便在我正在制作的文本编辑器中突出显示这些关键字的语法。我目前正在手动执行此操作,但我希望文本编辑器动态执行此操作,以防作者更改词法分析器。我该怎么做呢?这是正确的做法吗?

【问题讨论】:

    标签: java antlr lexer


    【解决方案1】:

    我认为 Antlr 本身没有标记“关键字”的归因机制,但这就是你应该阅读的内容。取而代之的是,您可以应用一种假设语法中的顺序的技巧,从而为关键字“DATABASE”和“FROM”定义第一个和最后一个规则。然后,编写一个方法来遍历 ruleNames[] 数组,您可以随时调用该数组来累积您在上面定义的第一个和最后一个规则名称之间的所有关键字名称。要完成这项工作,您必须编写一些类似“// 严厉惩罚的 cmets,仅在“DATABASE”和“FROM”之间的规则中添加关键字产生式。但是,Antlr 词法分析器规则是为了匹配偏好而排序的,所以这个hack 可能行不通。

    【讨论】:

    • 我最终使用了您的建议来使用 ruleNames[] 数组。据我所知,这是我正在尝试做的最好的解决方案。据我所知,在 Lexer 类中没有用于检索关键字列表的方法。
    猜你喜欢
    • 1970-01-01
    • 2011-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多