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()); }
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()); }