gpt4 book ai didi

rascal - 如何在 Rascal 中初始化包含表达式列表的元组

转载 作者:行者123 更新时间:2023-12-04 08:22:30 25 4
gpt4 key购买 nike

我正在尝试创建一种递归查找 For 循环的方法。我需要先初始化返回值(一个元组),但我该怎么做呢?
我试过: tuple[list[Expression],Statement] = [];
另外,如果我要绑定(bind)一个完整的语句,例如;

case s:\for(_,_,_,_): 
这是正确的类型吗:tuple[list[Expression],Statement]?

public tuple[list[Expression],Statement] showForLoops(loc project) {
set[loc] files = javaFiles(project);
set[Declaration] decls = createAstsFromFiles(files, false);
tuple[list[Expression],Statement] result = [];
visit (decls) {
case \for(initializers,_,_,body): result += < initializers, body>;
}
return(result);
}

最佳答案

简单的答案是您必须选择 Statement像这样输入:

result = <[], empty()>; // using the empty statement as a default
注意我没有使用类型(可以推断)
你也可以用一个类型来写它:
tuple[list[Expression],Statement] result = <[], empty()>;
虽然还有其他方法可以编写此代码,但您可能会觉得这很有趣。 \for构造函数本身,可以替换你需要的元组的概念。您可以稍后使用 myForLoop.initializers 投影其字段。 (例如):
Statement findFirstForStatement(loc project) {
decls = createAstsFromFiles(files, false);
visit(decls) {
case f:\for(_,_,_,_): return f;
}
return empty();
}

rascal>ff = findFirstForStatement(pr);
Statement: for(....)
rascal>ff.initializers
list[Expression]: [...]
或者你可以使用 Maybe:
import util::Maybe;

Maybe[tuple[list[Expression], Statement]] findFirstForLoop(loc project) {
decls = createAstsFromFiles(files, false);
visit(decls) {
case f:\for(_,_,_,_) : return just(f);
}
return nothing();
}
或者,最后,如果找不到任何东西,您可能会抛出异常:
Statement findFirstForLoop(loc project) {
decls = createAstsFromFiles(files, false);
visit(decls) {
case f:\for(_,_,_,_) : return f;
}

throw "couldn't find a for loop";
}
还有一个 Bonus 示例收集所有 for 循环,而不是找到第一个:
list[Statement] getAllForLoops(loc project) {
decls = createAstsFromFiles(files, false);
result = [];

visit(decls) {
case f:\for(_,_,_,_) : result += [f];
}
return result;
}
也可以写成理解:
list[Statement] getAllForLoops(loc project) {
decls = createAstsFromFiles(files, false);
return [ f | /f:\for(_,_,_,_) := decls];
}

关于rascal - 如何在 Rascal 中初始化包含表达式列表的元组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65429515/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com