在ANTLR4中是否可能有使用令牌的令牌
我是Antlr的新手,我正在努力学习。我有一个定义了标记的lexer。和另一个使用我的令牌子集的令牌在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
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寄存器)相同的结果。