void StereotypeDefinitionParser::expectColon()
{
    expectOperator(OPERATOR_COLON, QStringLiteral(":"));
}
Example #2
0
AST* Parser::expression(int pri, Scope* ps)
{
    Position begin = lex_->peek().range_.begin_;

    if (pri > 11)
    {
        if (expect("delete")
                || expect("++")
                || expect("--"))
        {
            Token op = lex_->get();
            AST* expr = leftExpression(ps);
            Position end = lex_->peek().range_.begin_;
            auto ret = new UniExpression(PositionRange(begin, end), op, expr);
            ret->scope_ = ps;
            return ret;
        }
        else if (expect("void")
                 || expect("typeof")
                 || expect("+")
                 || expect("-")
                 || expect("~")
                 || expect("!"))
        {
            Token op = lex_->get();
            AST* expr = expression(pri, ps);
            Position end = lex_->peek().range_.begin_;
            auto ret = new UniExpression(PositionRange(begin, end), op, expr);
            ret->scope_ = ps;
            return ret;
        }
        else
        {
            AST* expr = leftExpression(ps);
            if (expect("++") || expect("--"))
            {
                Token op = lex_->get();
                Position end = lex_->peek().range_.begin_;
                auto ret = new UniExpression(PositionRange(begin, end), expr, op);
                ret->scope_ = ps;
                return ret;
            }
            return expr;
        }
    }

    AST* left = expression(pri+1, ps);

    if (!expectOperator(pri))
    {
        return left;
    }

    Token op = lex_->get();

    if (pri == 1)
    {
        AST* first = expression(pri, ps);
        match(":");
        AST* second = expression(pri, ps);
        Position end = lex_->peek().range_.begin_;
        auto ret = new TriExpression(PositionRange(begin, end), left, first, second);
        ret->scope_ = ps;
        return ret;
    }

    AST* right = expression(pri, ps);

    Position end = lex_->peek().range_.begin_;

    AST* ret = new BiExpression(PositionRange(begin, end), left, op, right);
    ret->scope_ = ps;

    while (expectOperator(pri))
    {
        op = lex_->get();
        right = expression(pri+1, ps);
        ret = new BiExpression(PositionRange(begin, end), left, op, right);
        ret->scope_ = ps;
    }

    return ret;
}
void StereotypeDefinitionParser::expectComma()
{
    expectOperator(OPERATOR_COMMA, QStringLiteral(","));
}