有没有办法覆盖Java中的行号(例如,通过使用某种预处理器指令)?
我正在“编译”一种高级语言,使用Janino将其“编译”成Java字节码。我需要编译器错误来报告原始文件中的行,而不是生成的Java代码。
C#有#line指令,我已经成功地利用它将源文件中的行号映射到编译结果。我需要同样的Java代码。
谢谢!
发布于 2009-03-15 13:04:55
使用Janino,您可以从Scanner派生并覆盖location()方法。此方法返回一个Location对象。您可以重写read()方法来查找注释,例如在注释中(在代码生成过程中添加的),这些注释包含行号信息。
您只需将扫描器传递给SimpleCompiler.cook()方法,您就可以控制报告错误的文件名、行和列。
发布于 2009-02-10 03:25:48
我从来没有见过它只用于JSP,但是JSR-45被设计用于任何源语言的这个目的。该过程涉及以特殊格式("SMAP")创建第二个文件,该文件将原始源代码中的行号映射到生成的Java源代码中的行号。
发布于 2009-02-10 03:13:15
不幸的是,没有,在Java语言中没有对应的#line指令。最好的做法是在生成源代码后,通过删除/插入新行来修改源代码,使其与真实的源代码相匹配(或者修改代码生成器)。或者,您可以在编译后修改存储在二进制类文件中的行号,但这可能会更加痛苦。
https://stackoverflow.com/questions/530945
复制相似问题