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; }
bool Expr::parseMultiplicativeExpression() { PARSER_FLOW_TRACER(); /* right associative */ FAIL_IF_NOT(parseUnaryExpression()); while (IS_MULTI_EXPR_OPER(ahead().type())) { Model::ExprBinary::Ptr result = new Model::ExprBinary; result->setLeftOperand(model()); result->setBinaryOperator(tokenToBinary(ahead().type())); next(); FAIL_IF_NOT(parseUnaryExpression()); result->setRightOperand(model()); setModel(result); } return true; }
Value parseMultiplicativeExpression(void) { Value v1, v2; v1 = parseUnaryExpression(); while (token == TOK_STAR || token == TOK_SLASH || token == TOK_PERCENT) { if (token == TOK_STAR) { getToken(); v2 = parseUnaryExpression(); if (v1.sym != NULL || v2.sym != NULL) { error("multiplication of symbols not supported, line %d", lineno); } v1.con *= v2.con; } else if (token == TOK_SLASH) { getToken(); v2 = parseUnaryExpression(); if (v1.sym != NULL || v2.sym != NULL) { error("division of symbols not supported, line %d", lineno); } if (v2.con == 0) { error("division by zero, line %d", lineno); } v1.con /= v2.con; } else if (token == TOK_PERCENT) { getToken(); v2 = parseUnaryExpression(); if (v1.sym != NULL || v2.sym != NULL) { error("division of symbols not supported, line %d", lineno); } if (v2.con == 0) { error("division by zero, line %d", lineno); } v1.con %= v2.con; } } return v1; }