为什么Rhino对这个javascript不满意?

时间:2010-06-09 20:10:25

标签: java javascript antlr rhino

我已经在一些浏览器中使用ANTLR javascript target中的javascript库成功使用了我的代码,但现在我想在服务器上使用Rhino而我遇到了一些麻烦。我有一些简单的java代码引用了Rhino 1.7R2版本的js-14.jar文件。

Context context = Context.enter();
Scriptable scope = context.initStandardObjects();
context.evaluateReader(scope, new FileReader("C:\\antlr3-all.js"), "antlr", 1, null);

此操作失败,其中EcmaError的消息为:

TypeError: Cannot call property namespace in object [JavaPackage org.antlr]. 
It is not a function, it is "object". (antlr#259)

它所引用的javascript行是:

org.antlr.namespace("org.antlr.runtime.tree");

这个org.antlr.namespace在文件的前面被声明为函数,所以我不确定该怎么想。我也没有看到“命名空间”是javascript或Rhino中的保留字。

以下是第56行org.antlr.namespace的声明:

org.antlr.namespace = function() {
    var a=arguments, o=null, i, j, d;
    for (i=0; i<a.length; i=i+1) {
        d=a[i].split(".");
        o=org.antlr.global;

        // ANTLR is implied, so it is ignored if it is included
        for (j=0; j<d.length; j=j+1) {
            o[d[j]]=o[d[j]] || {};
            o=o[d[j]];
        }
    }

    return o;
};

ANTLR javascript target page提到Rhino是一个经过测试的平台,所以我想我可能只是在滥用Rhino。有人有任何提示吗?

1 个答案:

答案 0 :(得分:5)

  

TypeError:无法调用属性   对象中的命名空间[JavaPackage   org.antlr]。

它将您的org.antlr作为java包并尝试调用对象命名空间。所以定义这样的函数是行不通的。

定义函数名称空间的每个部分本身对我有用:

org = new function() {//Define the structure one piece at a time
    this.antlr = new function(){
         this.namespace = ''; 
         return this;
    };
    return this;
};
org.antlr.namespace = function() {print('Help'); return 0;}
抱歉,我不能给出更详细的答案,我不知道有关javascript ^^的mutch。 我想因为org和org.antlr是未定义的,所以你无法分配它们。