bool Expr::parseUnaryExpression() { PARSER_FLOW_TRACER(); /* left associative */ switch (ahead().type()) { case T_AT_SIGN: emitError("addr-of-operator unsupported"); // ### @foo (addr-of operator) return false; case T_MINUS: case T_PLUS: case T_NOT: { Model::ExprUnary::Ptr result = new Model::ExprUnary; result->setUnaryOperator(tokenToUnary(ahead().type())); next(); FAIL_IF_NOT(parsePrimaryExpression()); result->setOperand(model()); setModel(result); return true; } default: return parsePrimaryExpression(); } }
Value parseUnaryExpression(void) { Value v; if (token == TOK_PLUS) { getToken(); v = parseUnaryExpression(); } else if (token == TOK_MINUS) { getToken(); v = parseUnaryExpression(); if (v.sym != NULL) { error("cannot negate symbol '%s' in line %d", v.sym->name, lineno); } v.con = -v.con; } else if (token == TOK_TILDE) { getToken(); v = parseUnaryExpression(); if (v.sym != NULL) { error("cannot complement symbol '%s' in line %d", v.sym->name, lineno); } v.con = ~v.con; } else { v = parsePrimaryExpression(); } return v; }