/// <summary> /// Lee una sentencia Let /// </summary> private InstructionLet ReadCommandLet(Token token) { InstructionLet instruction = new InstructionLet(token); Token nextToken = GetToken(true); // Lee la variable if (nextToken.Type == Token.TokenType.Variable) { // Asigna la variable instruction.Variable = ReadVariableIdentifier(GetToken(), out string error); // Comprueba si hay algún error antes de continuar if (!string.IsNullOrWhiteSpace(error)) { instruction.Error = error; } else { // Signo igual nextToken = GetToken(true); if (nextToken.Type == Token.TokenType.Equal) { // Quita el igual GetToken(); // Lee las expresiones instruction.Expressions = ReadExpression(ExpressionReaderMode.Normal, out error); instruction.ExpressionsRPN = _expressionEvaluator.ConvertToRPN(instruction.Expressions); if (!string.IsNullOrEmpty(error)) { instruction.Error = error; } } else { instruction.Error = "No se encuentra el signo igual"; } } } else { instruction.Error = "Debe existir una variable en la parte izquierda"; } // Devuelve la instrucción return(instruction); }
/// <summary> /// Ejecuta una instrucción de asignación /// </summary> private void Execute(InstructionLet instruction) { Variable variable = ExpressionComputer.Search(instruction.Variable, out string error); if (!string.IsNullOrWhiteSpace(error)) { Compiler.LocalErrors.Add(instruction.Token, error); } else { ValueBase value = ExpressionComputer.Evaluate(instruction.ExpressionsRPN); if (value.HasError) { Compiler.LocalErrors.Add(instruction.Token, value.Error); } else { variable.Value = value; } } }