// Parse a primary expression. // // primary-expr -> literal | identifier | '(' expr ')' // // literal -> integer-literal // | boolean-literal // | character-literal // | string-literal Expr* Parser::primary_expr() { // identifier if (Token tok = match_if(identifier_tok)) return on_id(tok); // boolean-literal if (Token tok = match_if(boolean_tok)) return on_bool(tok); // integer-literal if (Token tok = match_if(integer_tok)) return on_int(tok); // character-literal if (Token tok = match_if(character_tok)) return on_char(tok); // string-literal if (Token tok = match_if(string_tok)) return on_str(tok); // paren-expr if (match_if(lparen_tok)) { Expr* e = expr(); match(rparen_tok); return e; } // FIXME: Is this definitely an error? Or can we // actually return nullptr and continue? error("expected primary expression"); }
// Parse a primary expression. // // primary-expression ::= // integer-literal // | '(' expression ')' Expr const* Parser::primary() { if (Token tok = match_if(integer_tok)) return on_int(tok); if (lookahead() == lparen_tok) return paren(); error(ts_.location(), "expected primary-expression"); throw Parse_error("primary"); }