从javascript表达式获取变量(rhino)

50pmv0ei  于 2021-07-09  发布在  Java
关注(0)|答案(1)|浏览(312)

我使用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 .

xuo3flqw

xuo3flqw1#

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]

但是,我不确定这对提高效率有多大帮助,除非表达式适合缓存。您将对代码进行两次解析,如果需要消除变量的歧义 abs 从函数开始 Math 需要进一步检查。

相关问题