我是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”。正确的方法是什么?
答案 0 :(得分:0)
您可以在其他令牌规则中使用令牌规则,但是当您这样做时,应该有与其匹配的其他文本。像这样:
A: 'abc';
B: A 'def';
鉴于这些规则,字符串“ abc”将产生一个A
令牌,而“ abcdef”将产生一个B
令牌。
但是,当您像定义一样将一个规则定义为其他规则的替代时,最终会出现多个词法规则,它们可能与同一输入匹配。当词法规则重叠时,ANTLR(就像绝大多数词法生成器一样)将首先选择会导致最长匹配的规则,如果出现联系,则选择在语法中最先出现的规则。
因此,根据您的规则,输入addq
将产生一个ADDQ
标记,因为ADDQ
出现在语法中的OP
之前。 SUBQ
和其他人也一样。因此,不可能生成OP
令牌。
由于您说过在解析器规则中不使用ADDQ
,SUBQ
等,因此可以使它们成为片段而不是令牌规则。片段可以在令牌规则中使用,但本身不是令牌。因此,您永远不会获得SUBQ
令牌,因为SUBQ
不是令牌-您只能获得OP
令牌。实际上,您甚至根本不必给它们起名字,您可以像这样将它们“内联”到OP中:
OP: 'addq' | 'subq' | 'andq' | 'xorq' ;
另一种选择(如果直接使用SUBQ
等则必须使用)是将OP
变成解析器规则而不是令牌。这样,输入subq
仍会生成一个SUBQ
令牌,但这没关系,因为现在op
规则将接受一个SUBQ
令牌。