2014-12-06 4 views
1

특정 라인과 열이 서로 다른 두 위치를 추가하는 방법이 있습니까? 결과로와위치에 추가

|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

재미있는 관찰. 필요한 위치에 추가하는 것은 현재는 기본 제공 작업으로 제공되지 않습니다 (하지만 추가 할 수도 있습니다). 지원 위치 및 문자열 입니다에 추가 : 여담으로

당신이 the description of Locations 보면

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

당신은 위치 자신에 추가 구축 모든 재료를 찾을 수 있습니다. 예를 들어,이 할 것 :

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

위의 솔루션은 위치가 중복이 사건을 취급 부족하다 (하지만 너무 솔루션을 당황하게하고 싶지 않았다

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

이 당신에게 줄 것이다 많은).

희망이 도움이됩니다.

+0

위의 답변은 http://stackoverflow.com/users/2382373/mark-hills의 제안을 통해 편집되었습니다. –

관련 문제