2011-02-17 41 views
0

Antlr3产生以下输出System.out,而其他人做正确的一切:这条ANTLR3日志消息的含义是什么?

line 0:0 null 
line 0:0 null 
line 0:0 null 
... 

它是什么?

ps。问题是,在解析时,我通过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

嗯,这是相当明显的,不是吗? :-D(我有时会发现antlr3的信息确实可能是神秘的) – 2011-02-17 16:13:14

+0

Nah,根本不明显......你知道这是什么意思吗? – yegor256 2011-02-17 16:16:40

回答

0

A RecognitionException应该由解析器本身抛出。这样的异常具有在解析器遍历令牌流(行号,索引,当前令牌等)时更新的所有类型的信息。所以,你不应该把它们扔掉。

看一看,处理错误报告和恢复这两个维基文章:

相关问题