我有一个简单的问题。
假设我有一个位置
loc l = |file:////Users/steven/tst.txt|;
我希望通过选择第5-10行来使其更加详细。我该怎么做?
简单陈述
l.begin.line = 5; l.begin.column = 0;
出错了。
所以,我有以下问题:
如何设置l.begin.line
和l.begin.column
?
如何轻松检测第10行的最后一列?
如何以简单的方式相应地设置l.offset
和l.length
?
我能找到定义位置的Rascal模块吗? (教程建议我在ListRelation和Map之间查看库,但这没有帮助)
答案 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; }