Пример #1
0
AST* Parser::primary(Scope* ps)
{
    if (expect("("))
    {
        match("(");
        AST* expr = expression(0, ps);
        match(")");
        return expr;
    }
    else if (expect(Token::Type::IDENTIFIER))
    {
        return identifier(ps);
    }
    else if (expect("true") || expect("false"))
    {
        return new LiteralBool(lex_->get());
    }
    else if (expect("null"))
    {
        return new LiteralNull(lex_->get());
    }
    else if (expect(Token::Type::STRING))
    {
        return new LiteralString(lex_->get());
    }
    else if (expect(Token::Type::NUMBER))
    {
        return new LiteralNumber(lex_->get());
    }
    else if (expect("this") || expect("arguments"))
    {
        auto ret = new Keyword(lex_->get());
        ret->scope_ = ps;
        return ret;
    }
    else if (expect("["))
    {
        return literalArray(ps);
    }
    else if (expect("{"))
    {
        return literalObject(ps);
    }
    else if (expect("function"))
    {
        return function(ps);
    }
    else if (expect(Token::Type::REGULAR))
    {
        return new LiteralRegular(lex_->get());
    }

    // throw exception?
    std::stringstream ss;
    ss << "Can not parse primary-expression, " << lex_->peek().toString();
    throw ParseError(ss.str());
}
Пример #2
0
void Parser::literal(MethodGenerationContext* mgenc) {
    switch (sym) {
    case Pound:
        PeekForNextSymbolFromLexerIfNecessary();
        if (nextSym == NewTerm) {
            literalArray(mgenc);
        } else {
            literalSymbol(mgenc);
        }
        break;
    case STString:
        literalString(mgenc);
        break;
    default:
        literalNumber(mgenc);
        break;
    }
}