void GenerateCode(Node node, Parser.Expression expression) { // Expressions are either plain values, or function calls switch (expression.type) { case Parser.Expression.Type.Value: // Plain value? Emit that GenerateCode(node, expression.value); break; case Parser.Expression.Type.FunctionCall: // Evaluate all parameter expressions (which will // push them to the stack) foreach (var parameter in expression.parameters) { GenerateCode(node, parameter); } // If this function has a variable number of parameters, put // the number of parameters that were passed onto the stack if (expression.function.paramCount == -1) { Emit(node, ByteCode.PushNumber, expression.parameters.Count); } // And then call the function Emit(node, ByteCode.CallFunc, expression.function.name); break; } }
private Yarn.Value EvaluateExpression(Parser.Expression expression) { if (expression == null) { return(new Yarn.Value()); } switch (expression.type) { case Parser.Expression.Type.Value: // just a regular value? return it return(EvaluateValue(expression.value.value)); case Parser.Expression.Type.FunctionCall: // get the function var func = expression.function; // evaluate all parameters var evaluatedParameters = new List <Value> (); foreach (var param in expression.parameters) { var expr = EvaluateExpression(param); evaluatedParameters.Add(expr); } var result = func.InvokeWithArray(evaluatedParameters.ToArray()); return(result); } throw new NotImplementedException("Unimplemented expression type " + expression.type.ToString()); }