/// <summary> /// Adds a token to the expression. /// </summary> /// <param name="token">The token to be added to the current expression.</param> public void Add(Token token) { var item = new ExpressionItem { Lexeme = token.Lexeme, Symbol = token.Symbol }; if (token.Symbol != Symbols.SNumero && token.Symbol != Symbols.SIdentificador && token.Symbol != Symbols.SVerdadeiro && token.Symbol != Symbols.SFalso && token.Symbol != Symbols.SAbreParenteses) { if (token.Symbol == Symbols.SFechaParenteses) { PopUntilOpenParenthesis(); return; } AddWithPriority(token); if (token.Symbol != Symbols.SAbreParenteses) { item.Type = _operatorsType[token.Symbol]; _items.Add(item); } } else { AddToken(token, item); } }
private ItemType GetExpressionType(ExpressionItem item, ItemType firstType, ItemType secondType) { if (item.Symbol == Symbols.SMais || item.Symbol == Symbols.SMenos || item.Symbol == Symbols.SDiv || item.Symbol == Symbols.SMult) { if (firstType == ItemType.Integer && secondType == ItemType.Integer) { return(ItemType.Integer); } else { ThrowInvalidOperandError(item.Lexeme, firstType, secondType); } } else if (item.Symbol == Symbols.SMaior || item.Symbol == Symbols.SMenor || item.Symbol == Symbols.SMaiorIg || item.Symbol == Symbols.SMenorIg) { if (firstType == ItemType.Integer && secondType == ItemType.Integer) { return(ItemType.Boolean); } else { ThrowInvalidOperandError(item.Lexeme, firstType, secondType); } } else if (item.Symbol == Symbols.SIg || item.Symbol == Symbols.SDif) { if ((firstType == ItemType.Integer && secondType == ItemType.Integer) || (firstType == ItemType.Boolean && secondType == ItemType.Boolean)) { return(ItemType.Boolean); } else { ThrowInvalidOperandError(item.Lexeme, firstType, secondType); } } else if (item.Symbol == Symbols.SE || item.Symbol == Symbols.SOu) { if (firstType == ItemType.Boolean && secondType == ItemType.Boolean) { return(ItemType.Boolean); } else { ThrowInvalidOperandError(item.Lexeme, firstType, secondType); } } return(ItemType.None); }
private void AddToken(Token token, ExpressionItem item) { if (token.Symbol == Symbols.SAbreParenteses) { item.Type = ItemType.None; _items.Add(item); } else { if (token.Symbol != Symbols.SFechaParenteses) { if (token.Symbol == Symbols.SIdentificador) { item.Type = GetIdentificatorType(token.Lexeme); } else { item.Type = _operatorsType[token.Symbol]; } _output.Add(item); } } }