Пример #1
0
        public static EvalResult binary_typeCheck(SymbolTable symbols, FunCall funcall, string funcName, EvalFunc f)
        {
            var left = funcall.args[0].value;
            var right = funcall.args[1].value;

            Func<Token, bool> isNumber = token => token.type == Lexical.Int || token.type == Lexical.Float;
            bool areNumbers = isNumber(left) && isNumber(right);

            if (areNumbers || left.type == right.type) return f(symbols, funcall);
            else return new EvalResult(new Error(0, "Non-matching types for " + funcName));
        }
Пример #2
0
        public static EvalResult eval_args(SymbolTable symbols, FunCall funcall, string funcName, int numArgs, EvalFunc f)
        {
            var evaled_args = funcall.args.Select(i => evaluate_FunCall(symbols, i)).ToList();

            if (evaled_args.Count() > numArgs) return new EvalResult(new Error(0, "Too many arguments to " + funcName + "!"));
            if (evaled_args.Count() < numArgs) return new EvalResult(new Error(0, "Too few arguments to " + funcName + "!"));

            foreach(var result in evaled_args)
                if (result.left == null) return new EvalResult(result.right);

            var results = FunCall.id_list(evaled_args.Select(a => a.left.Item2).ToList());

            return f(symbols, results);
        }