Antlr4一直对我来说是一种爱恨交织的关系,但目前我有些困惑。我已经开始以我所学的知识来创建语法,然后想对其进行测试,但它根本没有用。然后,我将其简化为一个最小的示例,并设法使其不起作用。这是我的语法:
grammar SwiftMtComponentFormat;
separator : ~ZERO EOF;
ZERO : '0';
据我了解,它应该是除“ 0”以外的任何内容,然后期望文件结尾。我一直在用我期望能够正常工作的单字符输入“ 1”进行测试。但这是发生了什么:
如果我将~ZERO
更改为ZERO
并将我的输入从1
更改为0
,则它实际上是完美匹配的...由于某种原因,似乎没有简单的否定去工作。我不明白这里的原因是什么...
答案 0 :(得分:2)
在解析器规则中,~ZERO
匹配不是ZERO
令牌的任何令牌。您遇到的问题是ZERO
是您定义的唯一令牌类型,因此任何其他输入都将导致令牌识别错误,并且根本不会到达解析器。因此,如果输入输入1
,则词法分析器将丢弃带有令牌识别错误的1
,并且解析器将仅看到空的令牌流。
要解决此问题,您只需定义一个词法分析器规则OTHER
即可匹配以前的词法分析器规则未匹配的任何字符:
OTHER: .;
请注意,此定义必须在ZERO
的定义之后 -否则也将匹配0。
现在输入1
将产生一个OTHER
令牌,而~ZERO
将与该令牌匹配。当然,您现在可以将~ZERO
替换为OTHER
,并且不会做任何更改,但是一旦添加了其他标记,~ZERO
也将与之匹配,而OTHER
将会与之匹配。不是。