我有一个简单的语法,如下所示:
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+xx
或5
或xx
)。使用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也不会产生错误。
我是否需要在某个地方设置一些特殊标志,以指示输入流应该恰好是一个生成器,并且没有任何尾随标记?
答案 0 :(得分:1)
我是否需要在某个地方设置一些特殊标志,以指示输入流应该恰好是一个生成器,并且没有任何尾随标记?
是的,这正是EOF
令牌的作用:
generator : expression EOF;
通过这种方式,无论ANTLR的版本如何,或是否包含expression '+' expression
规则,您都将始终在附加令牌上出错。