1

私はラスカルが初めてで、Java プロジェクトから条件ステートメント (if、while など) を抽出したいと考えています。

最良の方法はhttp://tutor.rascal-mpl.org/Rascal/Libraries/analysis/m3/Core/containment/containment.html#/Rascal/Libraries/analysis/m3/AST/AST.htmlにあるようです

これまでの私のコードは

    void statements(loc location) {
        ast = createAstFromFile(location,true,javaVersion="1.7");
        for(/Statement s := ast) println(readFile(s@src));
    }

しかし、これはコメントを含むすべてのステートメントを返します。if、while、for などの条件付きステートメントのみを返すようにステートメントをフィルター処理するにはどうすればよいですか?

4

2 に答える 2

1

Rascal は、このために Visitor パターンを実装しています。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にあります。

于 2013-12-29T10:07:29.110 に答える
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));
于 2013-12-30T09:23:44.403 に答える