4

Rhino を使用して js 式を評価しています。可能なすべての変数値をスコープに入れ、無名関数を評価しています。ただし、式はかなり単純なので、パフォーマンスのために、式で使用される値のみを入れたいと思います。

コードサンプル:

    Context cx = Context.enter();

    Scriptable scope = cx.initStandardObjects(null);

    // Build javascript anonymous function
    String script = "(function () {" ;

    for (String key : values.keySet()) {
        ScriptableObject.putProperty(scope, key, values.get(key));
    }
    script += "return " + expression + ";})();";

    Object result = cx.evaluateString(scope, script, "<cmd>", 1, null);

変数名である式からすべてのトークンを取得したい。

たとえば、式が

(V1ND < 0 ? Math.abs(V1ND) : 0)

戻りV1NDます。

4

1 に答える 1

6

Rhino 1.7 R3では、名前の検索に使用できるAST パッケージが導入されました。

import java.util.*;
import org.mozilla.javascript.Parser;
import org.mozilla.javascript.ast.*;

public class VarFinder {
  public static void main(String[] args) throws IOException {
    final Set<String> names = new HashSet<String>();
    class Visitor implements NodeVisitor {
      @Override public boolean visit(AstNode node) {
        if (node instanceof Name) {
          names.add(node.getString());
        }
        return true;
      }
    }
    String script = "(V1ND < 0 ? Math.abs(V1ND) : 0)";
    AstNode node = new Parser().parse(script, "<cmd>", 1);
    node.visit(new Visitor());
    System.out.println(names);
  }
}

出力:

[V1ND, abs, Math]

ただし、式がキャッシュに適していない限り、これが効率に大きく役立つかどうかはわかりません。コードを 2 回解析することになりabs、関数から変数を明確にする必要がある場合は、Mathさらなる検査が必要になります。

于 2013-01-22T14:31:13.450 に答える