1

我想知道如何将 JavaCC 抛出的 ParseException 格式化为人类可读的格式:实际上,它在异常的标记引用中包含诸如beginLine, beginColumn, endColumn,之类的字段endLine,但不包含对已解析源的引用。

谢谢!:)

4

3 回答 3

1

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

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

于 2009-10-15T02:38:37.963 回答
1

我不知道这是否足够,但您可以使用捕获的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();
    }
于 2011-02-20T20:26:31.743 回答
0

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

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

于 2011-06-24T21:15:37.013 回答