/*
* This file is part of cparser.
- * Copyright (C) 2007-2008 Matthias Braun <matze@braunis.de>
+ * Copyright (C) 2007-2009 Matthias Braun <matze@braunis.de>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
EXPR_INVALID,
EXPR_REFERENCE,
EXPR_REFERENCE_ENUM_VALUE,
- EXPR_CONST,
- EXPR_CHARACTER_CONSTANT,
- EXPR_WIDE_CHARACTER_CONSTANT,
+ EXPR_LITERAL_BOOLEAN,
+ EXPR_LITERAL_INTEGER,
+ EXPR_LITERAL_INTEGER_OCTAL,
+ EXPR_LITERAL_INTEGER_HEXADECIMAL,
+ EXPR_LITERAL_FLOATINGPOINT,
+ EXPR_LITERAL_FLOATINGPOINT_HEXADECIMAL,
+ EXPR_LITERAL_CHARACTER,
+ EXPR_LITERAL_WIDE_CHARACTER,
+ EXPR_LITERAL_MS_NOOP, /**< MS __noop extension */
EXPR_STRING_LITERAL,
EXPR_WIDE_STRING_LITERAL,
EXPR_COMPOUND_LITERAL,
EXPR_UNARY_CASES_MANDATORY \
EXPR_UNARY_CASES_OPTIONAL
+#define EXPR_LITERAL_CASES \
+ case EXPR_LITERAL_BOOLEAN: \
+ case EXPR_LITERAL_INTEGER: \
+ case EXPR_LITERAL_INTEGER_OCTAL: \
+ case EXPR_LITERAL_INTEGER_HEXADECIMAL: \
+ case EXPR_LITERAL_FLOATINGPOINT: \
+ case EXPR_LITERAL_FLOATINGPOINT_HEXADECIMAL: \
+ case EXPR_LITERAL_CHARACTER: \
+ case EXPR_LITERAL_WIDE_CHARACTER: \
+ case EXPR_LITERAL_MS_NOOP:
+
/**
* The base class of every expression.
*/
expression_kind_t kind; /**< The expression kind. */
type_t *type; /**< The type of the expression. */
source_position_t source_position; /**< The source position of this expression. */
- bool parenthesized;
+ bool parenthesized : 1;
#ifndef NDEBUG
- bool transformed; /**< Set if this expression was transformed. */
+ bool transformed : 1; /**< Set if this expression was transformed. */
#endif
};
/**
- * A constant.
+ * integer/float constants, character and string literals
*/
-struct const_expression_t {
+struct literal_expression_t {
expression_base_t base;
- union {
- long long int_value;
- long double float_value;
- string_t character;
- wide_string_t wide_character;
- } v;
- bool is_ms_noop; /**< True, if this constant is the result
- of an microsoft __noop operator */
+ string_t value;
+ symbol_t *suffix;
+
+ /* ast2firm data */
+ ir_tarval *target_value;
};
struct string_literal_expression_t {
string_t value; /**< the value once assigned. */
};
-struct wide_string_literal_expression_t {
- expression_base_t base;
- wide_string_t value;
-};
-
struct compound_literal_expression_t {
expression_base_t base;
type_t *type;
expression_base_t base;
expression_t *compound;
entity_t *compound_entry;
+ bool implicit : 1; /**< compiler generated select
+ (for anonymous struct/union) */
};
struct array_access_expression_t {
union expression_t {
expression_kind_t kind;
expression_base_t base;
- const_expression_t conste;
+ literal_expression_t literal;
+ string_literal_expression_t string_literal;
funcname_expression_t funcname;
- string_literal_expression_t string;
- wide_string_literal_expression_t wide_string;
compound_literal_expression_t compound_literal;
builtin_constant_expression_t builtin_constant;
builtin_types_compatible_expression_t builtin_types_compatible;
struct initializer_wide_string_t {
initializer_base_t base;
- wide_string_t string;
+ string_t string;
};
struct initializer_designator_t {
statement_t *global_asm;
};
-static inline
-void *_allocate_ast(size_t size)
+static inline void *_allocate_ast(size_t size)
{
return obstack_alloc(&ast_obstack, size);
}
-static inline
-bool is_invalid_expression(expression_t *expression)
+static inline bool is_invalid_expression(expression_t *expression)
{
return expression->base.kind == EXPR_INVALID;
}
-static inline
-bool is_invalid_statement(statement_t *statement)
+static inline bool is_invalid_statement(statement_t *statement)
{
return statement->base.kind == STATEMENT_INVALID;
}
#define allocate_ast(size) _allocate_ast(size)
+/**
+ * Allocate an AST node with given size and
+ * initialize all fields with zero.
+ */
+static inline void *allocate_ast_zero(size_t size)
+{
+ void *res = allocate_ast(size);
+ memset(res, 0, size);
+ return res;
+}
+
#endif