bool Expr::parseRelationalExpression() { PARSER_FLOW_TRACER(); /* right associative */ FAIL_IF_NOT(parseAdditiveExpression()); switch(ahead().type()) { case T_LESS_THAN_EQUAL: case T_GREATER_THAN_EQUAL: case T_LEFT_ANGLE: case T_RIGHT_ANGLE: case T_EQUAL: case T_INEQUAL: { Model::ExprBinary::Ptr result = new Model::ExprBinary; result->setLeftOperand(model()); result->setBinaryOperator(tokenToBinary(ahead().type())); next(); FAIL_IF_NOT(parseAdditiveExpression()); result->setRightOperand(model()); setModel(result); } } return true; }
Value parseShiftExpression(void) { Value v1, v2; v1 = parseAdditiveExpression(); while (token == TOK_LSHIFT || token == TOK_RSHIFT) { if (token == TOK_LSHIFT) { getToken(); v2 = parseAdditiveExpression(); if (v1.sym != NULL || v2.sym != NULL) { error("shifting of symbols not supported, line %d", lineno); } v1.con <<= v2.con; } else if (token == TOK_RSHIFT) { getToken(); v2 = parseAdditiveExpression(); if (v1.sym != NULL || v2.sym != NULL) { error("shifting of symbols not supported, line %d", lineno); } v1.con >>= v2.con; } }