2014-12-06 42 views
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的工作,我想有一个选择块,但我怎么也找不到,所以我试图添加每个语句的位置,但这是行不通的。

回答

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

你一定要小心这个但是 - 有一些情况和可能的错误条件,这不处理(例如,位置重叠,位置传入错误的顺序,位置实际上来自不同的文件)。它应该只处理两个相邻结构的“合并”位置。

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

上述解决方案达不到处理这些情况下的位置重叠(但我不想混淆解决方案过于许多)。

希望这会有所帮助。

+0

上述答案是在http://stackoverflow.com/users/2382373/mark-hills的建议后编辑的 – 2014-12-06 14:23:12