我正在嘗試向 Java 檔案中的方法添加檢測(例如記錄一些資訊)。我正在使用以下 Rascal 代碼,它似乎主要作業:
import ParseTree;
import lang::java::\syntax::Java15;
// .. more imports
// project is a loc
M3 model = createM3FromEclipseProject(project);
set[loc] projectFiles = { file | file <- files(model)} ;
for (pFile <- projectFiles) {
CompilationUnit cunit = parse(#CompilationUnit, pFile);
cUnitNew = visit(cunit) {
case (MethodBody) `{<BlockStm* post>}`
=> (MethodBody) `{
'System.out.println(new Throwable().getStackTrace()[0]);
'<BlockStm* post>
'}`
}
writeFile(pFile, cUnitNew);
}
我遇到了兩個關于空格的問題,這可能是無關的。
我插入的代碼行不會保留以前存在的空格。如果有制表符,現在將被洗掉。對于直接在我插入的行和右括號之后的行也是如此。如何在我的模式中“捕獲”空白?
轉換前的示例(所有行以制表符開頭,第 2 行和第 3 行以兩個字符開頭):
void beforeFirst() throws Exception {
rowIdx = -1;
rowSource.beforeFirst();
}
轉換后的示例:
void beforeFirst() throws Exception {
System.out.println(new Throwable().getStackTrace()[0]);
rowIdx = -1;
rowSource.beforeFirst();
}
關于空格的附加問題;如果檔案以換行符結尾,則 parse 函式將拋出 ParseError 而沒有更多詳細資訊。從原始源中洗掉此換行符將解決該問題,但我不想在決議之前“手動”修復代碼。我怎樣才能規避這個問題?
uj5u.com熱心網友回復:
唉,用具體的模式捕獲空白不是當前版本的 Rascal 的功能。我們曾經擁有它,但現在它又回到了 TODO 串列中。如果您有興趣,我可以向您指出有關該主題的論文。所以現在你必須稍后處理這個“損害”。
您可以撰寫通用級別的樹到樹轉換(請參閱 ParseTree.rsc),以在轉換后修復決議樹中的縮進問題,或者重新插入丟失的注釋。這是關于匹配 Tree 資料型別和appl建構式。Tree 格式是對 Rascal 決議樹的一種反射形式,它允許任何型別的轉換,包括空格和注釋。
你說的決議錯誤是沒有使用start非終端引起的。如果您parse(#start[CompilationUnit], ...)在 CompilationUnit 前后使用空格和注釋,則接受。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/385201.html
上一篇:C#錯誤的十進制決議/轉換
