Exemple #1
0
        /*
         * the operator == + - * / % are buildin
         * + - * / % only for int value
         */
        private static EnviromentNode ApplyBuildinFunction(EnviromentNode funcNode, EnviromentNode[] parameters, Enviroment enviroment)
        {
            EnviromentNode retNode = new EnviromentNode(enviroment);

            foreach (EnviromentNode node in parameters)
            {
                EvalDelayEvalBlock(node);
            }
            if (funcNode.Symbol == "==")
            {
                if (parameters.Length < 2 )
                    throw new Exception("invalid parameters for ==, different value type");
                retNode.ValueType = "int";
                retNode.IValue = (parameters[0].Equals(parameters[1])) ? 1 : 0;
            }
            else if( funcNode.Symbol == "+")
            {
                if (parameters.Length < 2 || parameters[0].ValueType != "int" || parameters[1].ValueType != "int")
                    throw new Exception("invalid parameters for ==, different value type");
                retNode.ValueType = "int";
                retNode.IValue = parameters[0].IValue + parameters[1].IValue;
            }
            else if( funcNode.Symbol == "-")
            {
                if (parameters.Length < 2 || parameters[0].ValueType != "int" || parameters[1].ValueType != "int")
                    throw new Exception("invalid parameters for ==, different value type");
                retNode.ValueType = "int";
                retNode.IValue = parameters[0].IValue - parameters[1].IValue;
            }
            else if( funcNode.Symbol == "*")
            {
                if (parameters.Length < 2 || parameters[0].ValueType != "int" || parameters[1].ValueType != "int")
                    throw new Exception("invalid parameters for ==, different value type");
                retNode.ValueType = "int";
                retNode.IValue = parameters[0].IValue * parameters[1].IValue;
            }
            else if( funcNode.Symbol == "/")
            {
                if (parameters.Length < 2 || parameters[0].ValueType != "int" || parameters[1].ValueType != "int")
                    throw new Exception("invalid parameters for ==, different value type");
                retNode.ValueType = "int";
                retNode.IValue = parameters[0].IValue / parameters[1].IValue;
            }
            else if( funcNode.Symbol == "%")
            {
                if (parameters.Length < 2 || parameters[0].ValueType != "int" || parameters[1].ValueType != "int")
                    throw new Exception("invalid parameters for ==, different value type");
                retNode.ValueType = "int";
                retNode.IValue = parameters[0].IValue % parameters[1].IValue;
            }
            else
            {
                throw new NotImplementedException();
            }

            retNode.Symbol = "__tmp__" + enviroment.TopCount().ToString();
            return retNode;
        }
Exemple #2
0
        /*
         * IO need special support
         */
        static EnviromentNode ApplyIO(EnviromentNode func, EnviromentNode[] parameters, Enviroment enviroment)
        {
            EnviromentNode retNode = null;
            if (parameters.Length > 0)
            {
                EnviromentNode paramNode = parameters[0];
                retNode = new EnviromentNode(enviroment, paramNode);
            }
            else
            {
                retNode = new EnviromentNode(enviroment);
            }

            retNode.Terminate = false;
            if (func.Symbol == "return")
            {
                if (parameters.Length == 0)
                    throw new Exception("invalid IO: return without parameters");
                retNode.Terminate = true;
            }
            else if (func.Symbol == "print")
            {
                StringBuilder printString = new StringBuilder();
                foreach (EnviromentNode node in parameters)
                {
                    EvalDelayEvalBlock(node);
                    if( node.ValueType == "string" )
                    {
                        printString.Append(node.SValue);
                    }
                    else if( node.ValueType == "int")
                    {
                        printString.Append(node.IValue.ToString());
                    }
                    else if( node.ValueType == "lambda")
                    {
                        printString.Append(node.Type);
                    }
                    else
                    {
                        printString.Append(node.Symbol);
                    }
                }
                Console.WriteLine(printString.ToString());

            }
            else if (func.Symbol == "readline")
            {
                retNode.SValue = Console.ReadLine();
            }
            retNode.Symbol = "__tmp__" + enviroment.TopCount().ToString();
            return retNode;
        }