在 Rascal 中读取文件行作为位置

Reading the file lines as locs in Rascal

在文件IO模块中有一个从文件中读取行的函数。 list[str] fileLines = readFileLines(fileLoc);

函数整齐returns字符串。这些字符串中的每一个也可以表示为具有 fileLoc(O, L, , ) 格式的 loc。如何从文件中加载行作为 loc 资源?

简答:库函数readFiles将源位置作为参数并读取文件的内容。如果该源位置包含位置信息,则它只会读取与该位置信息对应的文件部分。

答案有点长:

这是一个例子:

module Example
    
void main() { 
    str text = "a\nbc\ndef\n";
    loc tmpLoc = |home:///tmp.txt|;
    writeFile(tmpLoc, text);    // write example text to file
    
    // Read lines back and print them
    println("Using readFileLines:");
    for(s <- readFileLines(tmpLoc)) println(s);
    
    // Add position information to tmpLoc that corresponds to each of the lines,
    // read it back and print it:
    
    println("Using source location with position info:");
    println(readFile(tmpLoc[offset=0][length=1]));
    println(readFile(tmpLoc[offset=2][length=2]));
    println(readFile(tmpLoc[offset=5][length=3]));
}

预期输出为:

Using readFileLines:
a
bc
def
Using source location with position info:
a
bc
def

最后备注:

  • 通常位置信息是自动生成的 通过工具(例如解析器);程序员大多 使用 这些信息,他们不必创建它(但他们可以)。
  • 解析器通常会生成完整的行和列信息,这里我们只使用offsetlength