Javascript测试文件返回未定义的值

时间:2017-03-05 11:33:16

标签: javascript node.js undefined-behavior

我必须制作LET语言的Javascript版本并制作测试文件。但是每当我调用一个函数时,它的回复都是未定义的。有一个AST文件,一个解释器文件,最后是我的测试文件。还有一个环境文件,但我的测试文件工作得很好。

你们中的任何人可以帮助我并告诉我为什么它的返回未定义?

这是AST.js / Interp.js文件的测试文件

var main = function(){

//console.log(valueOf(AST.DiffExp(5,3)))
var env1=Env.Env(null,null,null)
var env1=Env.extendEnv(env1, "x", 250);
console.log(AST.ConstExp(8))


}


//var modules = require('./modules.js');
var ConstExp = require('./Interp.js', './AST.js');
var AST=require('./AST.js', './Interp.js')
var valueOf=require('./Interp.js')
var Env= require("./Environment.js")
if(require.main === module) {
main();
}

这是AST.js文件

function ConstExp(i)  {
    this.Int = i;
}
function VarExp(id) {
    this.Id  = id;
}
function IsZeroExp (exp) {
    this.Exp = exp;
}
function DiffExp (exp1, exp2) {
    this.Exp1 = exp1;
    this.Exp2 = exp2;
}
function IfExp (cond, cons, alt)  {
    this.Exp1 = cond; //Condition
    this.Exp2 = cons; //Consequent
    this.Exp3 = alt;  //Alternative
}
//id is a strng not an expression
function LetExp (id, val, inExp) {
    this.Id = id;
    this.Exp1 = val
    this.Exp2 = inExp
}

module.exports = {
    ConstExp : ConstExp,
    VarExp : VarExp,
    IsZeroExp : IsZeroExp,
    DiffExp : DiffExp,
    IfExp : IfExp,
    LetExp : LetExp
}

这是解释器文件(Interp.js)

function valueOf (e, p) {
    switch(e.constructor){
        case AST.ConstExp: 
                return Number(e.Int);
                break;
        case AST.VarExp:
                return ENV.applyEnv(p, e.Id);
                break;
        case AST.IsZeroExp:
                return valueOf(e.Exp, p) == 0;
                break;
        case AST.DiffExp: 
                return valueOf(e.Exp1, p) - valueOf(e.Exp2, p);
                break;
        case AST.LetExp:
                var body = e.Exp2;
                var v = valueOf(e.Exp1, p);
                var pp = ENV.extendEnv(p, e.Id, v);
                return valueOf(body, pp);
                break;
        case AST.IfExp: 
                if (valueOf(e.Exp1, p) == true){
                    return valueOf(e.Exp2, p);
                } else {
                    return valueOf(e.Exp3, p);
                }
                break;
    }
}
module.exports = {
    valueOf: valueOf
}
AST = require("./AST.js");
ENV = require("./Environment.js");

0 个答案:

没有答案