如何建造一个位置?

时间:2016-02-15 12:02:36

标签: location rascal

我有一个简单的问题。

假设我有一个位置

 loc l = |file:////Users/steven/tst.txt|;

我希望通过选择第5-10行来使其更加详细。我该怎么做?

简单陈述

l.begin.line = 5; l.begin.column = 0;

出错了。

所以,我有以下问题:

  1. 如何设置l.begin.linel.begin.column

  2. 如何轻松检测第10行的最后一列?

  3. 如何以简单的方式相应地设置l.offsetl.length

  4. 我能找到定义位置的Rascal模块吗? (教程建议我在ListRelation和Map之间查看库,但这没有帮助)

2 个答案:

答案 0 :(得分:0)

很好的问题。源位置的规则是,如果您在文件中提供位置信息并且想要提供行和列信息,则还需要偏移/长度,如下所示:

/**
 * Adds an excluded paths.
 * @param path the path, as packaged in the APK
 */

您也可以直接在文字中输入:

rascal>a = |file:///Users/steven/tst.txt|;
loc: |file:///Users/steven/tst.txt|
rascal>b = a(0,10,<2,0>,<4,10>);
loc: |file:///Users/steven/tst.txt|(0,10,<2,0>,<4,10>)

或没有行/列信息:

rascal>a = |file:///Users/steven/tst.txt|(0,10,<2,0>,<4,10>);
loc: |file:///Users/steven/tst.txt|(0,10,<2,0>,<4,10>)

无法使用行/列信息创建没有偏移量/长度的位置。要获取创建完整rascal>a = |file:///Users/steven/tst.txt|(0,10); loc: |file:///Users/steven/tst.txt|(0,10) 所需的信息,通常需要访问该文件的内容。

PS:我们计算文件中的unicode字符,而不是字节。

答案 1 :(得分:0)

感谢您的回答,根据您的回答,我可以构建我需要的函数,即从文件构建位置以及开始和结束编织的函数。

从Rascal构建的位置检测到eol=2

如果你看到一个缺陷,请你纠正吗?

public loc getFragment(loc f, int startLine, int endLine) {

    loc fragment = |file:///null|;
    int eol = 2;

    if (exists(f)) {
        int offset = 0;
        int len = 0;
        int i = 0;
        int endCol = 0;
        for (str line <- readFileLines(f)) {
            i += 1;
            if (i < startLine) {
                offset += size(line) + eol;
            } else if (i <= endLine) {
                len += size(line);
                if (i == endLine) {
                    endCol = size(line);
                } else {
                    len += eol;
                }
            }
        }
        fragment = f(offset,len,<startLine,0>,<endLine,endCol>);
    } 
    return fragment;
}