2009-02-10 22 views
13

有什麼方法可以覆蓋Java中的行號(例如,通過使用某種預處理器指令)?在生成的Java源代碼中覆蓋行號

我正在編譯高級語言,使用Janino編譯爲Java字節代碼。我需要編譯器錯誤報告來自原始文件的行,而不是生成的Java代碼。

C#有#line指令,我已經成功利用它將行號從源文件映射到編譯結果。我需要Java的相同。

謝謝!

+0

如果您正在編譯爲Java字節碼,那麼您應該知道行號。或者你的意思是你正在編譯爲Java,並且Java編譯器正在將它編譯爲字節碼? – jdigital 2009-02-10 03:14:54

回答

3

使用JANINO你可以從Scanner派生並重寫location()方法。該方法返回一個Location對象。您可以覆蓋read()方法以在例如註釋(在代碼生成過程中添加)中查找註釋,該註釋包含行號信息。

您只需將您的掃描儀傳送至SimpleCompiler.cook()方法,您就可以控制報錯的文件名,行和列。

4

不幸的是,沒有,在Java中沒有等效的#line指令。您可以做的最好的方法是在刪除/插入換行符以匹配真實源代碼(或修改代碼生成器)之後修改源代碼。或者,您可以在編譯後修改二進制類文件中存儲的行號,但這可能會更加痛苦。

1

沒有簡單的解決方案。一種解決方法是在生成代碼時生成從[您的語言]到Java的行號映射。您可以通過管道編譯器輸出並使用映射將Java的行號替換爲行號。

8

我從來沒有見過它用於JSP以外的其他版本,但JSR-45被設計用於任何源語言的此目的。該過程涉及以特殊格式(「SMAP」)創建第二個文件,該文件將原始源代碼中的行號映射到生成的Java源代碼中的行號。

3

除了生成Java代碼作爲您的中間語言之外,您可以嘗試使用JVM彙編程序。 Jasmin具有很好的語法,並且可以在代碼中的適當位置自由插入.line指令。您也可以使用.source指令指定原始源文件。

當然,要彙編的路線可能會更麻煩比它的價值:)