在 ClaiR 中,(还)不可能将 AST 中所做的更改写回文件。出于这个原因,我创建了一个列表lrel[int, int, str] changes = [];
,其中包含要删除的子字符串的开始位置和结束位置,以及需要替换它的字符串。
当我拥有想要对源文件进行的更改的完整列表时,我会对更改进行排序并使用以下命令打开文件fb = chars(readFile(f));
做出改变
public list[int] changeCharList(list[int] charList, lrel[int, int, str] changesList) {
int offset = 0;
for (t <- [0 .. size(changesList)]) {
tuple[int startIndex, int endIndex, str changeWithString] change = changesList[t];
int startIndexWithOffset = change.startIndex + offset;
int endIndexWithOffset = change.endIndex + offset;
list[int] changeWithChars = chars(change.changeWithString);
for (i <- [startIndexWithOffset .. endIndexWithOffset]) {
charList = delete(charList, startIndexWithOffset);
}
for (i <- [0 .. size(changeWithChars)]) {
charList = insertAt(charList, startIndexWithOffset + i, changeWithChars[i]);
}
offset += size(changeWithChars) - (change.endIndex - change.startIndex);
}
return charList;
}
并写入文件writeFileBytes(f, fb);
此方法适用于没有扩展宏的源文件,但不适用于具有扩展宏的源文件。在后一种情况下,AST 中使用的偏移量不会将偏移量与使用readFile
.
作为一种解决方法,我可以在运行 Rascal 之前注释宏,并在运行 Rascal 之后取消注释它们。我不喜欢这个。
有没有办法以 AST 偏移量映射文件读取偏移量的方式重新计算偏移量?