Пример #1
0
// 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");
}
Пример #2
0
// 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");
}