Example #1
0
        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;
            }
        }
Example #2
0
        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());
        }