Antlr 4.7在输入流的末尾不再为输入生成errorNodes

时间:2019-03-07 19:00:44

标签: antlr antlr4

我有一个简单的语法,如下所示:

grammar Test;
generator : expression;

expression
    : NUMBER                         # Number
    | ID                             # String
    | expression '+' expression      # Add
    ;

NUMBER: [0-9]+ [0-9]*;
ID : [a-zA-Z_]+ [a-zA-Z0-9_]* ;

我希望将表达式5xx视为错误(因为它应该是5+xx5xx)。使用Antlr 4.6会发生这种情况,但是使用antlr 4.7不会发生这种情况。

这是我的完整测试:

    @Test()
    public void doATest() {
        TestLexer lexer = new TestLexer(new ANTLRInputStream("5xx"));
        TestParser parser = new TestParser(new CommonTokenStream(lexer));

        //Walk the tree and throw if there are any error nodes.
        ParseTreeWalker.DEFAULT.walk(new TestBaseListener() {
            @Override public void visitErrorNode(ErrorNode node) {
                //Throws with 4.6, not with 4.7
                throw new RuntimeException("Hit error node: " + node);
            }
        }, parser.generator());
    }

我有另一个奇怪的发现,就是包含expression '+' expression规则很重要,没有这个4.6也不会产生错误。

我是否需要在某个地方设置一些特殊标志,以指示输入流应该恰好是一个生成器,并且没有任何尾随标记?

1 个答案:

答案 0 :(得分:1)

  

我是否需要在某个地方设置一些特殊标志,以指示输入流应该恰好是一个生成器,并且没有任何尾随标记?

是的,这正是EOF令牌的作用:

generator : expression EOF;

通过这种方式,无论ANTLR的版本如何,或是否包含expression '+' expression规则,您都将始终在附加令牌上出错。