/// <summary> /// Builds a sum or suntract command and adds it to current scope. /// Type and operands are gotten from symbol stack. /// Result is pushed to the symbol stack. /// </summary> private void DoPendingSum() { var op2 = _symbolStack.Pop(); var op1 = _symbolStack.Pop(); var oper = _operatorStack.Pop(); Type type; if (CheckTypeMismatch(op1, op2, oper, out type)) { // Add new symbol to scope var result = _varBuilder.NewVariable(type); _currentScope.Add(result); Command cmd = null; switch (oper) { case Operator.Sum: cmd = new Sum { Op1 = op1, Op2 = op2, Result = result }; break; case Operator.Minus: cmd = new Subtract { Op1 = op1, Op2 = op2, Result = result }; break; } // Add to symbol stack and add command to scope's commands. _symbolStack.Push(result); _currentScope.CommandList.Commands.Add(cmd); } }
/// <summary> /// Creates necessary commands to make a value negative. /// </summary> private void DoNegative() { var value = _symbolStack.Pop(); if (value.Type != Type.Entero && value.Type != Type.Decimal) { SemErr("Esta variable no puede ser negativa."); } var zero = _constBuilder.IntConstant("0"); var result = _varBuilder.NewVariable(value.Type); var cmd = new Subtract { Op1 = zero, Op2 = value, Result = result }; _currentScope.CommandList.Commands.Add(cmd); _symbolStack.Push(result); }