我想知道怎样才能以人类可读的格式格式化JavaCC抛出的ParseException:实际上它包括beginLine
,beginColumn
,endColumn
等字段, endLine
在异常的令牌引用中,但不是对已解析的源的引用。
谢谢! :)
答案 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时,走一下堆栈是一件简单的事情,这样用户就可以看到包含每个文件的上下文(即父级中的行号)。