Antlr3向System.out
生成以下输出,同时正确执行其他操作:
line 0:0 null
line 0:0 null
line 0:0 null
...
它是什么?
PS。问题是在解析I RecognitionException()
时不时。看起来null
就是这样的结果。应该有一些有意义的消息,而不是null
,而RecognitionException没有这样的构造函数。怎么办?
grammar Bar;
document: ( CHAR { Foo.validate($CHAR.text); } )+ EOF;
CHAR: 'a'..'z';
Foo
类在同一个包中的某个地方:
public class Foo {
public static void validate(String txt) throws RecognitionException {
if ("q".equals(txt)) {
throw new RecognitionException();
}
}
}
现在进行单元测试:
public class BarTest {
@Test public void testEverything() throws Exception {
this.parse("abc"); // valid
this.parse("abcq"); // invalid
}
private void parse(String txt) {
CharStream input = new ANTLRStringStream(txt);
BarLexer lexer = new BarLexer(input);
TokenStream tokens = new CommonTokenStream(lexer);
BarParser parser = new BarParser(tokens);
parser.document();
}
}
输出结果为:
line 0:0 null
答案 0 :(得分:0)
解析器本身应该抛出RecognitionException
。此类异常具有在解析器通过令牌流(行号,索引,当前令牌等)时更新的所有类型的信息。所以,你不应该自己抛弃它们。
查看处理错误报告和恢复的这两篇Wiki文章: