是否有可能在 ANTLR4 中使用令牌

Is it possible to have tokens that use tokens in ANTLR4

我是 Antlr 的新手,我正在努力学习。我有一个带有定义标记的词法分析器。还有另一个使用我的令牌子集的令牌。

ADDQ: 'addq';
SUBQ: 'subq';
ANDQ: 'andq';
XORQ: 'xorq';
OP: (ADDQ | ANDQ | XORQ | SUBQ);

在我的解析器中,我有一个名为 doOperation 的规则:

doOperation:
    OP REGISTER COMMA REGISTER;

当我使用 Intellij 的 ANTLR 插件测试规则时。举个例子:subq %rax, %rcx。我收到一条错误消息 "mismatched input at subq, expect OP"。这样做的正确方法是什么?

您可以在其他令牌规则中使用令牌规则,但是当您这样做时,周围应该有其他匹配的文本。类似于:

A: 'abc';
B: A 'def';

根据这些规则,字符串 "abc" 将生成一个 A 标记,而 "abcdef" 将生成一个 B 标记。

但是,当您像您一样将一个规则定义为替代其他规则时,您最终会得到多个可以匹配相同输入的词法规则。当词法规则重叠时,ANTLR(就像绝大多数词法分析器生成器一样)将首先选择导致最长匹配的规则,如果出现平局,则选择语法中最先出现的规则。

因此根据您的规则,输入 addq 会产生一个 ADDQ 标记,因为 ADDQ 在语法中出现在 OP 之前。 SUBQ 和其他人也一样。所以不可能生成 OP 令牌。

既然你说你在解析器规则中不使用 ADDQSUBQ 等,你可以将它们制成片段而不是令牌规则。片段可用于令牌规则,但本身不是令牌。所以你永远不会得到 SUBQ 令牌,因为 SUBQ 不是令牌 - 你只能得到 OP 令牌。事实上,你甚至根本不需要给他们起名字,你可以像这样 "inline" 他们进入 OP:

OP: 'addq' | 'subq' | 'andq' | 'xorq' ;

另一个选项(如果您直接使用 SUBQ 等则必须使用的选项)是将 OP 变成解析器规则而不是标记。这样输入 subq 仍会生成 SUBQ 标记,但这没关系,因为现在 op 规则将接受 SUBQ 标记。