Expresion* Sintactico::_ParseRelationalExpression(Expresion* expr1) { //Utilizamos Primeros( Relational-Operator ) if ( proximo_token.GetTipo() == op_igual || proximo_token.GetTipo() == op_distinto || proximo_token.GetTipo() == op_menorque || proximo_token.GetTipo() == op_mayorque || proximo_token.GetTipo() == op_menorigual || proximo_token.GetTipo() == op_mayorigual ) { tipo_token op = ParseRelationalOperator(); Expresion* expr2 = ParseSimpleExpression(); switch ( op ) { case op_igual: return new ExprIgualQue(expr1,expr2); case op_distinto: return new ExprDistinto(expr1,expr2); case op_menorque: return new ExprMenorQue(expr1,expr2); case op_mayorque: return new ExprMayorQue(expr1,expr2); case op_menorigual: return new ExprMenorIgual(expr1,expr2); case op_mayorigual: return new ExprMayorIgual(expr1,expr2); } } return expr1; }
TPParseTreeNode CFormulaParser::ParseExpression() { int token_ID = _tokenizer.LookAhead(); TPParseTreeNode expression; // Handle brackets before unary, because brackets are also "unary" if (TokenIsBracketOpen(token_ID)) { expression = ParseBracketExpression(); } else if (TokenIsUnary(token_ID)) { expression = ParseUnaryExpression(); } else if ((token_ID == kTokenIdentifier) || (token_ID == kTokenNumber)) { expression = ParseSimpleExpression(); } else { CParseErrors::Error("Unexpected token inside expression.\n" "Expecting: opening bracket, unary operator, identifier or number.\n"); return NULL; } token_ID = _tokenizer.LookAhead(); if (TokenIsBinary(token_ID)) { _tokenizer.GetToken(); // Special handling of percentaged potsized bets, // that look like modulo or percentage operators, // but lack a 2nd operand and have "Force" instead. // When ... RaiseBy 60% Force if (token_ID == kTokenOperatorPercentage) { int next_token_ID = _tokenizer.LookAhead(); if (next_token_ID == kTokenKeywordForce) { // Now we should pushback the *2nd last* token (percentage) _tokenizer.PushBackAdditionalPercentageOperator(); // and return the expression we got so far return expression; } } TPParseTreeNode second_expression = ParseExpression(); TPParseTreeNode binary_node = new CParseTreeNode(_tokenizer.LineRelative()); binary_node->MakeBinaryOperator(token_ID, expression, second_expression); write_log(preferences.debug_parser(), "[FormulaParser] Binary node %i\n", binary_node); return binary_node; } else if (token_ID == kTokenOperatorConditionalIf) { // Ternary condition TPParseTreeNode then_expression; TPParseTreeNode else_expression; ParseConditionalPartialThenElseExpressions( &then_expression, &else_expression); TPParseTreeNode ternary_node = new CParseTreeNode(_tokenizer.LineRelative()); ternary_node->MakeTernaryOperator(token_ID, expression, then_expression, else_expression); write_log(preferences.debug_parser(), "[FormulaParser] Ternary node %i\n", ternary_node); return ternary_node; } else { // We got the complete expression // No complex binary or ternary condition write_log(preferences.debug_parser(), "[FormulaParser] Expression %i\n", expression); return expression; } }
Expresion* Sintactico::ParseRelationalExpression() { Expresion* expr1 = ParseSimpleExpression(); return _ParseRelationalExpression(expr1); }