我必须制作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");