/* * 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; }
/* * 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; }