public override Type Check(TEnv env, FEnv fenv) { foreach (var expression in expressions) { Type argType = expression.Check(env, fenv); FuncDef fDef = fenv.getFunction(fName); if (!fDef.CheckArgType(argType)) { throw new TypeException("Type error in call of function " + fName); } } return(Type.intType); }
void Program(out Program p) { p = null; FuncDef f = null; String name = null; Expression e = null; Dictionary <String, FuncDef> functions = new Dictionary <string, FuncDef>(); while (la.kind == 8 || la.kind == 9) { FuncDef(out f, out name); functions.Add(name, f); } IfElseExpr(out e); p = new Program(functions, e); }
public override int Eval(REnv env, FEnv fenv) { int value = 0; List <int> values = new List <int>(); foreach (var expression in expressions) { int argValue = expression.Eval(env, fenv); values.Add(argValue); } FuncDef fDef = fenv.getFunction(fName); value = fDef.Eval(env, fenv, values); return(value); }
void FuncDef(out FuncDef f, out String name) { f = null; Expression e = null; Type rt = null; ListFormalArgs args = new List <Pair <string, Type> >(); TypeExpr(out rt); Ident(out name); Expect(3); if (la.kind == 7 || la.kind == 8) { FormalArgs(out args); } Expect(4); Expect(5); IfElseExpression(out e); Expect(6); f = new FuncDef(rt, name, args, e); }
public override Type Check(TEnv env, FEnv fenv) { Type[] types = new Type[args.Count]; int index = 0; foreach (Expression arg in args) { types[index++] = arg.Check(env, fenv); } FuncDef fDef = fenv.getFunction(fName); if (fDef.CheckArgTypes(types)) { return(fDef.returnType); } else { throw new TypeException("Type error in call of function " + fName); } }
public override int Eval(REnv env, FEnv fenv) { int[] argValues; if (args.Count > 0) { int index = 0; argValues = new int[args.Count]; foreach (Expression arg in args) { argValues[index++] = arg.Eval(env, fenv); } } else { argValues = new int[0]; } FuncDef fDef = fenv.getFunction(fName); return(fDef.Eval(env, fenv, argValues)); }