我是流氓的新手,想要从java项目中提取条件语句(if,while等)。
到目前为止,我的代码是
void statements(loc location) {
ast = createAstFromFile(location,true,javaVersion="1.7");
for(/Statement s := ast) println(readFile(s@src));
}
但是这会返回所有语句,包括注释。 如何过滤语句只返回条件语句if,while,for等?
答案 0 :(得分:1)
Rascal为此实现了访问者模式。您可以在ast
变量上执行以下操作:
visit(ast){
case \if(icond,ithen,ielse): {
println(" if-then-else statement with condition <icond> found"); }
case \if(icond,ithen): {
println(" if-then statement with condition <icond> found"); }
};
此示例返回代码中的if
语句。
您可以在包lang::java::m3::AST中找到要用作案例模式的模式定义。
答案 1 :(得分:0)
@ Geert-Jan Hut的答案是最好的,因为这就是访问的目的。
以下是其他一些方法:
for(/\if(icond,ithen,ielse) s := ast)
println(readFile(s@src));
for(/\if(icond,ithen) s := ast)
println(readFile(s@src));
或者,因为两个构造函数具有相同的名称,所以可以使用is
:
for (/Statement s := ast, s is if)
println(readFile(s@src));
或者,首先收集它们然后打印:
conds = { c | /Statement s := ast, s is if };
for (c <- conds)
println(readFile(c@src));