【问题标题】:Addition on location地点补充
【发布时间】:2014-12-06 11:25:42
【问题描述】:

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

【问题讨论】:

    标签: rascal


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      希望这会有所帮助。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-08
      相关资源
      最近更新 更多