1

在 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 偏移量映射文件读取偏移量的方式重新计算偏移量?

4

0 回答 0