1

有没有办法将 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,我想选择一个块,但我找不到方法,所以我尝试添加每个语句的位置,但这不起作用。

4

2 回答 2

1

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

顺便说一句:支持添加位置和字符串

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

如果您查看位置的描述,您会发现自己在位置上构建添加的所有成分。例如,这会做:

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>)

上述解决方案无法处理这些位置重叠的情况(但我不想过多地混淆解决方案)。

希望这可以帮助。

于 2014-12-06T14:00:41.637 回答
1

基于保罗的回答,这也处理了典型情况,即第二个位置和第一个位置之间存在“间隙”(可能是空格):

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;
}

但是,您绝对必须小心这一点——有很多情况和可能的错误情况是它无法处理的(例如,位置重叠,位置以错误的顺序传入,位置实际上来自不同的文件)。不过,它应该只处理两个相邻结构的“合并”位置。

于 2014-12-06T14:27:20.770 回答