2014-12-06 70 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