Antlr4 极其简单的语法失败

Antlr4 extremely simple grammar failing

Antlr4对我来说一直是一种又爱又恨的关系,但目前有点迷茫。我已经开始尽我所能创建一个语法,然后想测试它,但它根本不起作用。然后我将它大量减少到一个最低限度的例子,我设法让它不起作用。这是我的语法:

grammar SwiftMtComponentFormat;

separator              : ~ZERO EOF;

ZERO                   : '0';

根据我的理解,它应该是除“0”之外的任何内容,然后期望文件结束。我一直在用我期望工作的单个字符输入“1”来测试它。然而,这是发生了什么:

如果我将 ~ZERO 更改为 ZERO 并将我的输入从 1 更改为 0 它实际上完全匹配...出于某种原因,简单的否定确实似乎不起作用。我不明白这是什么原因...

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

要解决这个问题,您可以简单地定义一个词法分析器规则 OTHER 来匹配之前的词法分析器规则不匹配的任何字符:

OTHER: .;

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

现在输入 1 将产生一个 OTHER 标记,并且 ~ZERO 将匹配该标记。当然,您现在可以将 ~ZERO 替换为 OTHER,它不会改变任何东西,但是一旦您添加了额外的标记,~ZERO 也会匹配那些标记,而 OTHER 会没有。