如何使用rascal从javaeclipse项目中提取特定语句
我是rascal的新手,希望从java项目中提取条件语句(if、while等) 最好的方法似乎是 到目前为止,我的代码是如何使用rascal从javaeclipse项目中提取特定语句,java,eclipse,abstract-syntax-tree,rascal,Java,Eclipse,Abstract Syntax Tree,Rascal,我是rascal的新手,希望从java项目中提取条件语句(if、while等) 最好的方法似乎是 到目前为止,我的代码是 void statements(loc location) { ast = createAstFromFile(location,true,javaVersion="1.7"); for(/Statement s := ast) println(readFile(s@src)); } 但这将返回包括注释在内的所有语句。 如果、
void statements(loc location) {
ast = createAstFromFile(location,true,javaVersion="1.7");
for(/Statement s := ast) println(readFile(s@src));
}
但这将返回包括注释在内的所有语句。
如果、while、for等,如何过滤语句以仅返回条件语句?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"); }
};
访问(ast){
案例\如果(icond、ithen、ielse):{
println(“找到条件的if-then-else语句”);}
case\if(icond,ithen):{
println(“找到条件的if-then语句”);}
};
本例返回代码中的if
语句
您可以在包中找到用作案例模式的模式定义。@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));
conds={c}/语句s:=ast,s是if};
对于(c)