예제 #1
0
        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);
        }
예제 #2
0
        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);
        }
예제 #3
0
        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);
        }
예제 #4
0
        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);
        }