使用JavaCC格式化ParseException

时间:2009-10-14 05:43:13

标签: java parsing text-parsing javacc

我想知道怎样才能以人类可读的格式格式化JavaCC抛出的ParseException:实际上它包括beginLinebeginColumnendColumn等字段, endLine在异常的令牌引用中,但不是对已解析的源的引用。

谢谢! :)

3 个答案:

答案 0 :(得分:1)

问题是,默认情况下,JavaCC不保留原始源数据。因此,除非你以某种方式保留对令牌的引用,否则它们不会被保存在内存中。即使您确实挂在所有常规令牌上,您也需要为您定义的任何SKIP令牌添加特殊处理 - 例如,丢弃空格和注释。 JavaCC没有保留所有这些东西的原因是它会使用 lot 更多的内存。

保留所有令牌图像绝对可行......只需要进行一些半人工干预。

答案 1 :(得分:1)

我不知道它是否足够,但你可以使用来自catned ParseException 对象的属性 currentToken

try {
parser.Start();
    }
    catch(ParseException e){
        System.out.println("Problem with code!");
        System.out.println("Unknown symbol >> " 
            + e.currentToken.image 
            + " << Line:" + e.currentToken.beginLine 
            + ", column:" + e.currentToken.beginColumn);
        //e.printStackTrace();
    }

答案 2 :(得分:0)

在调用解析器之前保留文件名。然后,当您捕获ParseException时,重新读取该文件,并使用beginLine跳到右侧。或者,不要使用文件名,而是自己保留原始源文本。

我最近使用过javacc并且做到了这一点。还必须递归地处理包含类似的文件,所以我让解析器构建了一堆包含的源文件。在捕获ParseException时,走一下堆栈是一件简单的事情,这样用户就可以看到包含每个文件的上下文(即父级中的行号)。