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()); }
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; } }