【问题标题】:Is there a way to insert phases between the lexer and parser in ANTLR有没有办法在 ANTLR 中的词法分析器和解析器之间插入阶段
【发布时间】:2020-09-20 09:16:26
【问题描述】:

我正在为一种语言编写词法分析器/解析器,该语言允许其关键字使用缩写(和 glob)。而且,我正在尝试确定最好的方法。

我想到的一个想法是在词法分析器和解析器之间插入一个阶段,词法分析器可以识别通用类,例如这是一个“命令名称”还是一个“选项”,然后将这些通用标记传递到第二阶段,该阶段进行进一步分析并识别它是哪个命令名称并将其作为标记类型传递给解析器。

这将使解析器变得简单。我只需要处理格式正确的命令名称。每个令牌都将清楚它的含义。

它将使词法分析器保持简单。它只需要将事物划分为类。这是一个简单的名字。这是一个球体。这是一个选项名称(以破折号开头)。

相是中间也会比较简单。简单的名称(和选项形式)只需要处理字符串。 glob 表单可以使用标准 glob 技术将 glob 与合法候选者进行匹配,这些候选者在简单名称和选项的表格中。

问题是如何将该阶段插入 ANTLR,以便我调用词法分析器并创建标记,中间阶段对它们进行按摩,然后解析器获取中间阶段分类的标记。

对此有已知的解决方案吗?

类似:

lexer grammar simple
letter: [A-Z][a-z];
digit: [0-9];
glob-char: [*?];
name: letter (letter | digit)*;
option: '-'name;
glob: (glob-char|letter)(glob-char|letter|digit)*;
glob-option: '-'glob;

filter grammar name;
end: 'e' | 'end';
generate: 'ge' | 'generate';
goto: 'go' | 'goto';
help: 'h' | 'help';
if: 'i' | 'if';
then: 't' | 'then';

parser grammar simple;

用户(编写我正在解析的语言的程序员)需要编写 g*te 并且如果匹配 generate

词法分析器和解析器之间的阶段当它看到一个 glob 时需要查看 glob(和关键字列表)并查看其中是否只有一个与 glob 匹配,如果是,则返回该关键字。我在“过滤器语法”中列出的东西是构建关键字 glob 可以匹配的列表的东西。我在网上找到了将 glob 与名称列表匹配的代码。这部分并不难。

而且,我已经在 ANTLR 文档中找到了如何在匹配令牌时运行任意代码以及如何更改生成的令牌类型。 (见我的回答。)

【问题讨论】:

  • 如果一个 glob 匹配多个关键字,预期的行为是什么?
  • 具体例子会有很大帮助。
  • 我不知道在 glob 匹配多个关键字的情况下预期的行为是什么。我将不得不尝试使用现有实现的示例,看看它做了什么。
  • 此功能主要用于编写“混淆”代码。例如,``` (&(gcm w-o) more-stuff ``` 是 (&(Get-Command new-object) more-stuff gcm 是 Get-Command 的缩写和w-o 匹配 New-Object -- 语言对这些匹配不区分大小写。开头的 & 执行 get-command 返回的命令和 new-object 后面的 more-stuff(我省略了因为在我正在查看的情况下它是恶意软件)。描述要创建什么样的对象。

标签: parsing antlr4 lexer


【解决方案1】:

看起来您可以使用 lexerCustomActions 来达到预期的效果。类似于以下内容。

在你的词法分析器中:

GLOB: [-A-Za-z0-9_.]* '*' [-A-Za-z0-9_.*]*  { setType(lexGlob(getText())); }

在您的 Java(或您使用的任何语言代码)中:

void int lexGlob(String origText()) {
   return xyzzy; // some code that computes the right kind of token type
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多