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

时间:2018-07-25 17:13:03

标签: antlr4 intellij-plugin antlrworks

我是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。我收到一条错误消息:“ subq的输入不匹配,需要OP”。正确的方法是什么?

1 个答案:

答案 0 :(得分:0)

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

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

鉴于这些规则,字符串“ abc”将产生一个A令牌,而“ abcdef”将产生一个B令牌。

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

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

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

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

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