Пример #1
0
        /// <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);
        }
Пример #2
0
        /// <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;
                }
            }
        }