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

5

我已经成功地在一些浏览器中使用javascript库中的代码,其中包括ANTLR javascript target。但现在我想在服务器上使用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行是:

它所指的javascript行是:

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

这个org.antlr.namespace在文件前面被声明为一个函数,所以我不确定该怎么看待它。 我也没有在javascript或特别是Rhino中看到“namespace”是一个保留字。

以下是第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目标页面提到Rhino是一个经过测试的平台,所以我认为可能只是我在错误地使用Rhino。有没有人有什么建议呢?

1个回答

5

类型错误:无法在对象[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了解不多^^。 我猜想由于org和org.antlr未定义,所以您无法对它们进行赋值。

谢谢...你的预编辑答案给了我提示。antlr脚本文件的第一部分执行if (typeof org == "undefined" || !org) { var org = {}; }。显然,org并不是真正的未定义,因此它没有被创建为空的javascript对象。移除初始化周围的if似乎可以解决问题。 - Chris Farmer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接