Example #1
0
        public override MinceObject Evaluate(Interpreter interpreter)
        {
            string identifier = interpreter.Eat().ToString();

            if (interpreter.variables.Exists(identifier))
            {
                interpreter.pointer--;
                VariableTree tree = Identifier.GetTree(interpreter);

                if (!tree.lastWasFunc)
                {
                    if (interpreter.currentToken.type == "EQUALS")
                    {
                        if (tree.lastVariable.isReadOnly)
                        {
                            throw new InterpreterException(interpreter.previousToken, "'" + tree.lastVariable.name + "' is readonly!");
                        }

                        interpreter.Eat();

                        MinceObject result = interpreter.evaluation.Evaluate();

                        tree.lastVariable.SetValue(result);
                    }
                    else if (interpreter.currentToken.type == "PLUS" && interpreter.tokens[interpreter.pointer + 1].type == "PLUS")
                    {
                        if (tree.lastVariable.GetValue().GetType() != typeof(MinceNumber))
                        {
                            throw new InterpreterException(interpreter.previousToken, "Can only increment a MinceNumber, not a " + tree.lastVariable.GetValue().GetType().Name);
                        }

                        interpreter.Eat();
                        interpreter.Eat();

                        ((MinceNumber)tree.lastVariable.GetValue()).inc();
                    }
                    else if (interpreter.currentToken.type == "MINUS" && interpreter.tokens[interpreter.pointer + 1].type == "MINUS")
                    {
                        if (tree.lastVariable.GetValue().GetType() != typeof(MinceNumber))
                        {
                            throw new InterpreterException(interpreter.previousToken, "Can only increment a MinceNumber, not a " + tree.lastVariable.GetValue().GetType().Name);
                        }

                        interpreter.Eat();
                        interpreter.Eat();

                        MinceNumber num = (MinceNumber)tree.lastVariable.GetValue();
                        tree.lastVariable.SetValue(num.Minus(new MinceNumber(1)));
                    }
                }

                interpreter.Eat("SEMICOLON");
            }
            else
            {
                Variable variable = new Variable();
                variable.name  = identifier;
                variable.depth = interpreter.depth;

                interpreter.Eat("EQUALS");

                MinceObject value = interpreter.evaluation.Evaluate();

                variable.SetValue(value);

                interpreter.variables.variables.Add(variable);
                interpreter.Eat("SEMICOLON");
            }

            return(new MinceNull());
        }
Example #2
0
        public override MinceObject Evaluate(Interpreter interpreter)
        {
            int startPos = interpreter.pointer;

            interpreter.Eat();

            var varToken = interpreter.currentToken;

            string varName = interpreter.Eat("IDENTIFIER").ToString();

            interpreter.Eat("EQUALS");
            MinceNumber varValue = (MinceNumber)interpreter.evaluation.Evaluate();

            interpreter.Eat("COLON");

            if (interpreter.loopPositions.Count <= 0 || interpreter.loopPositions[0].depth != interpreter.depth)
            {
                // New for loop is created

                Variable indexVar = new Variable(varName, varValue, false, interpreter.depth);

                if (interpreter.variables.Exists(varName))
                {
                    throw new InterpreterException(varToken, "Cannot use variable '" + varName + "' in a for loop because it already exists!");
                }

                interpreter.variables.variables.Add(indexVar);

                interpreter.loopPositions.Insert(0, new LoopPosition(startPos, interpreter.depth)
                {
                    index = 0
                });
            }

            bool shouldRun = (bool)(interpreter.evaluation.Evaluate() as MinceBool).value;

            interpreter.Eat("COLON");

            int incrementPos = interpreter.pointer;

            while (interpreter.currentToken.type != "L_CURLY_BRACE")
            {
                interpreter.Eat();
            }

            interpreter.Eat("L_CURLY_BRACE");
            interpreter.depth++;

            if (!shouldRun)
            {
                interpreter.SkipBlock();
                interpreter.variables.variables.Remove(interpreter.variables.variables.Find(x => x.name == varName));
                interpreter.loopPositions.RemoveAt(0);
                return(new MinceNull());
            }

            interpreter.EvaluateBlock();

            if (interpreter.loopPositions.Count < 1 || interpreter.loopPositions[0].depth != interpreter.depth)
            {
                interpreter.variables.variables.Remove(interpreter.variables.variables.Find(x => x.name == varName));
                if (interpreter.loopPositions.Count > 0)
                {
                    interpreter.loopPositions.RemoveAt(0);
                }
                return(new MinceNull());
            }

            interpreter.GoTo(incrementPos);

            interpreter.EvaluateOnce();

            interpreter.GoTo(startPos);
            interpreter.depth = interpreter.loopPositions[0].depth;

            return(new MinceNull());
        }