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

在ANTLR4中是否可能有使用令牌的令牌,antlr4,intellij-plugin,antlrworks,Antlr4,Intellij Plugin,Antlrworks,我是Antlr的新手,我正在努力学习。我有一个定义了标记的lexer。和另一个使用我的令牌子集的令牌 ADDQ: 'addq'; SUBQ: 'subq'; ANDQ: 'andq'; XORQ: 'xorq'; OP: (ADDQ | ANDQ | XORQ | SUBQ); 在我的解析器中,我有一个名为doOperation的规则: doOperation: OP REGISTER COMMA REGISTER; 当我使用Intellij的ANTLR插件测试规则时。举个例子:su

我是Antlr的新手,我正在努力学习。我有一个定义了标记的lexer。和另一个使用我的令牌子集的令牌

ADDQ: 'addq';
SUBQ: 'subq';
ANDQ: 'andq';
XORQ: 'xorq';
OP: (ADDQ | ANDQ | XORQ | SUBQ);
在我的解析器中,我有一个名为doOperation的规则:

doOperation:
    OP REGISTER COMMA REGISTER;

当我使用Intellij的ANTLR插件测试规则时。举个例子:subq%rax,%rcx。我得到一个错误,上面写着,“subq的输入不匹配,期望OP”。正确的方法是什么

您可以在其他令牌规则中使用令牌规则,但当您这样做时,应该会在其周围匹配其他文本。比如:

A: 'abc';
B: A 'def';
根据这些规则,字符串“abc”将生成
A
标记,“abcdef”将生成
B
标记

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

因此,根据您的规则,输入
addq
将生成
addq
标记,因为
addq
在语法中出现在
OP
之前。SUBQ和其他的相同。所以不可能生成
OP
令牌

因为您说过在解析器规则中不使用
ADDQ
SUBQ
等,所以您可以将它们作为片段而不是令牌规则。片段可以在令牌规则中使用,但其本身不是令牌。因此,您永远不会得到
SUBQ
令牌,因为
SUBQ
不是令牌-您只能获得
OP
令牌。事实上,你甚至不必给他们起名字,你可以像这样把他们“内联”到OP中:

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

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

您是在任何解析器规则中直接使用
ADDQ
等,还是只使用
op
?在后一种情况下,您可以制作
ADDQ
等片段。@sepp2k不,现在只是OP@sepp2k我也尝试过制作片段,但intellij也出现了同样的错误。由于某种原因,当我尝试使用带有-tree或-gui的命令行运行时,我得到了一个rule*的no方法,或者它有一个参数。除非您在其他地方也匹配了
'subq'
,否则将它们转换为片段肯定会解决问题。我得去看医生,告诉你问题出在哪里。关于您在命令行上的尝试:这似乎是的一个实例,但应该在最新版本中解决。谢谢。成功了。我不得不删除所有内容,然后像你那样重新开始。我还认为这也与我假设ANTLR具有分配属性这一事实有关。例如:(POPQ | PUSHQ)寄存器不会给出与(POPQ寄存器| PUSHQ寄存器)相同的结果。