Antlr4语法极其简单失败

时间:2019-08-16 16:22:18

标签: antlr antlr4

Antlr4一直对我来说是一种爱恨交织的关系,但目前我有些困惑。我已经开始以我所学的知识来创建语法,然后想对其进行测试,但它根本没有用。然后,我将其简化为一个最小的示例,并设法使其不起作用。这是我的语法:

grammar SwiftMtComponentFormat;

separator              : ~ZERO EOF;

ZERO                   : '0';

据我了解,它应该是除“ 0”以外的任何内容,然后期望文件结尾。我一直在用我期望能够正常工作的单字符输入“ 1”进行测试。但这是发生了什么:

enter image description here

如果我将~ZERO更改为ZERO并将我的输入从1更改为0,则它实际上是完美匹配的...由于某种原因,似乎没有简单的否定去工作。我不明白这里的原因是什么...

1 个答案:

答案 0 :(得分:2)

在解析器规则中,~ZERO匹配不是ZERO令牌的任何令牌。您遇到的问题是ZERO是您定义的唯一令牌类型,因此任何其他输入都将导致令牌识别错误,并且根本不会到达解析器。因此,如果输入输入1,则词法分析器将丢弃带有令牌识别错误的1,并且解析器将仅看到空的令牌流。

要解决此问题,您只需定义一个词法分析器规则OTHER即可匹配以前的词法分析器规则未匹配的任何字符:

OTHER: .;

请注意,此定义必须在ZERO的定义之后 -否则也将匹配0。

现在输入1将产生一个OTHER令牌,而~ZERO将与该令牌匹配。当然,您现在可以将~ZERO替换为OTHER,并且不会做任何更改,但是一旦添加了其他标记,~ZERO也将与之匹配,而OTHER将会与之匹配。不是。