コード例 #1
0
 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);
 }
コード例 #2
0
ファイル: Parser.cs プロジェクト: christianknu/SPLC2016
        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);
        }
コード例 #3
0
ファイル: Expressions.cs プロジェクト: christianknu/SPLC2016
        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));
        }