增加位置

时间:2014-12-06 11:25:43

标签: rascal

有没有办法添加具有特定行和列的2个位置?

类似的东西:

|project://MyProject/src/MyClass.java|(962,10,<39,2>,<39,12>) + |project://MyProject/src/MyClass.java|(975,53,<40,2>,<40,55>);

结果:

 |project://MyProject/src/MyClass.java|(962,66,<39,2>,<40,55>)

我目前正在与AST合作,我希望有一个块的选择,但我无法找到我是如何尝试添加每个语句的位置但是赢得了&#39;工作。

2 个答案:

答案 0 :(得分:1)

有趣的观察。根据需要添加位置目前不是作为内置操作提供的(但我们可能会考虑添加它)。

暂且不说:地址添加和字符串支持

rascal>|project://MyProject/src| + "MyClass.java";
loc: |project://MyProject/src/MyClass.java|

如果你看the description of Locations,你会发现所有的成分都可以自己建立。例如,这样做:

loc add(loc s, loc r) {
    res = s;
    res.end = r.end;
    res.length = s.length + r.length;
    return res;
}

这会给你:

rascal>add(|project://MyProject/src/MyClass.java|(962,10,<39,2>,<39,12>),   |project://MyProject/src/MyClass.java|(975,53,<40,2>,<40,55>));
loc: |project://MyProject/src/MyClass.java|(962,63,<39,2>,<40,55>)

上述解决方案在处理这些位置重叠的情况下不尽如人意(但我不想过多地混淆解决方案)。

希望这有帮助。

答案 1 :(得分:1)

在保罗的回答的基础上,这也处理了典型的情况,那里有一个&#34;差距&#34; (可能是空白)在第二个位置和第一个位置之间:

loc add(loc s, loc r) {
    res = s;
    res.end = r.end;
    adjust = 0;
    if (s.offset + s.length < r.offset) {
        adjust = r.offset - (s.offset+s.length);
    }
    res.length = s.length + r.length + adjust;
    return res;
}

你必须要小心这一点 - 有一些案例和可能的错误条件,这是无法处理的(例如,位置重叠,以错误顺序传入的位置,实际上是位置来自不同的文件)。它应该只处理&#34;合并&#34;但是,两个相邻结构的位置。