我想知道如何将 JavaCC 抛出的 ParseException 格式化为人类可读的格式:实际上,它在异常的标记引用中包含诸如beginLine
, beginColumn
, endColumn
,之类的字段endLine
,但不包含对已解析源的引用。
谢谢!:)
我想知道如何将 JavaCC 抛出的 ParseException 格式化为人类可读的格式:实际上,它在异常的标记引用中包含诸如beginLine
, beginColumn
, endColumn
,之类的字段endLine
,但不包含对已解析源的引用。
谢谢!:)
问题是,默认情况下,JavaCC 不保留原始源数据。因此,除非您以某种方式保留对令牌的引用,否则它们不会保存在内存中。即使您确实使用了所有常规标记,您也需要为您定义的任何 SKIP 标记添加特殊处理 - 例如,丢弃空格和注释。JavaCC 不保留所有这些东西的原因是它会使用更多的内存。
保留所有令牌图像绝对是可行的……只需要一些半人工干预。
我不知道这是否足够,但您可以使用捕获的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();
}
在调用解析器之前保留文件名。然后,当您捕获 ParseException 时,重新读取文件并使用 beginLine 跳到正确的行。或者,您自己保留原始源文本,而不是文件名。
我最近使用了 javacc 并做到了这一点。还必须递归处理类似包含的文件,所以我让解析器构建了一堆包含的源文件。捕获 ParseException 后,遍历堆栈是一件简单的事情,这样用户就可以看到包含每个文件的上下文(即父级中的行号)。