代码之家  ›  专栏  ›  技术社区  ›  Chris Farmer Marcelo Cantos

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

  •  4
  • Chris Farmer Marcelo Cantos  · 技术社区  · 15 年前

    我已经成功地将我的代码与 ANTLR javascript target 在一些浏览器中,但是现在我想在服务器上使用Rhino,我遇到了一些问题。我有一些简单的Java代码,引用了犀牛1.7R2版本的JS.14JAR文件。

    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中的保留字。

    这是声明 org.antlr.namespace名称空间 在第56行:

    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 提到犀牛是一个测试平台,所以我想我可能只是误用了犀牛。有人有什么建议吗?

    1 回复  |  直到 15 年前
        1
  •  5
  •   josefx    15 年前

    类型错误:无法调用属性 对象[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是未定义的,你就不能分配给它们。