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