Expr *new_expr_int(SrcPos pos, ulong val, TokenMod mod, TokenSuffix suffix) { var e = new_expr(EXPR_INT, pos); e->int_lit.val = val; e->int_lit.mod = mod; e->int_lit.suffix = suffix; return(e); }
Expr new_expr_float(SrcPos pos, string strVal, double val, TokenSuffix suffix) { var e = new_expr(EXPR_FLOAT, pos); e.float_lit.strVal = strVal; e.float_lit.val = val; e.float_lit.suffix = suffix; return(e); }
Expr *new_expr_float(SrcPos pos, char *start, char *end, double val, TokenSuffix suffix) { var e = new_expr(EXPR_FLOAT, pos); e->float_lit.start = start; e->float_lit.end = end; e->float_lit.val = val; e->float_lit.suffix = suffix; return(e); }
Expr *parse_expr_operand() { var pos = token.pos; if (is_token(TOKEN_INT)) { var val = token.int_val; var suffix = token.suffix; var mod = token.mod; next_token(); return(new_expr_int(pos, val, mod, suffix)); } if (is_token(TOKEN_FLOAT)) { char * start = token.start; char * end = token.end; double val = token.float_val; TokenSuffix suffix = token.suffix; next_token(); return(new_expr_float(pos, start, end, val, suffix)); } if (is_token(TOKEN_STR)) { var mod = token.mod; var val = token.str_val; next_token(); return(new_expr_str(pos, val, mod)); } if (is_token(TOKEN_NAME)) { var name = token.name; next_token(); if (is_token(TOKEN_LBRACE)) { return(parse_expr_compound(new_typespec_name(pos, &name, 1))); } return(new_expr_name(pos, name)); } if (match_keyword(new_keyword)) { return(parse_expr_new(pos)); } if (match_keyword(sizeof_keyword)) { expect_token(TOKEN_LPAREN); if (match_token(TOKEN_COLON)) { var type = parse_type(); expect_token(TOKEN_RPAREN); return(new_expr_sizeof_type(pos, type)); } var expr = parse_expr(); expect_token(TOKEN_RPAREN); return(new_expr_sizeof_expr(pos, expr)); } if (match_keyword(alignof_keyword)) { expect_token(TOKEN_LPAREN); if (match_token(TOKEN_COLON)) { Typespec *type = parse_type(); expect_token(TOKEN_RPAREN); return(new_expr_alignof_type(pos, type)); } else { Expr *expr = parse_expr(); expect_token(TOKEN_RPAREN); return(new_expr_alignof_expr(pos, expr)); } } if (match_keyword(typeof_keyword)) { expect_token(TOKEN_LPAREN); if (match_token(TOKEN_COLON)) { Typespec *type = parse_type(); expect_token(TOKEN_RPAREN); return(new_expr_typeof_type(pos, type)); } else { Expr *expr = parse_expr(); expect_token(TOKEN_RPAREN); return(new_expr_typeof_expr(pos, expr)); } } if (match_keyword(offsetof_keyword)) { expect_token(TOKEN_LPAREN); Typespec *type = parse_type(); expect_token(TOKEN_COMMA); char *name = parse_name(); expect_token(TOKEN_RPAREN); return(new_expr_offsetof(pos, type, name)); } if (is_token(TOKEN_LBRACE)) { return(parse_expr_compound(null)); } if (match_token(TOKEN_LPAREN)) { if (match_token(TOKEN_COLON)) { var type = parse_type(); expect_token(TOKEN_RPAREN); if (is_token(TOKEN_LBRACE)) { return(parse_expr_compound(type)); } return(new_expr_cast(pos, type, parse_expr_unary())); } var expr = parse_expr(); expect_token(TOKEN_RPAREN); return(new_expr_paren(pos, expr)); } fatal_error_here("Unexpected token {0} in expression", token_info()); return(null); }