Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用rascal从javaeclipse项目中提取特定语句_Java_Eclipse_Abstract Syntax Tree_Rascal - Fatal编程技术网

如何使用rascal从javaeclipse项目中提取特定语句

如何使用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)); } 但这将返回包括注释在内的所有语句。 如果、

我是rascal的新手,希望从java项目中提取条件语句(if、while等)

最好的方法似乎是

到目前为止,我的代码是

    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)