+ case EXPR_UNARY_ASSUME: \
+ case EXPR_UNARY_DELETE: \
+ case EXPR_UNARY_DELETE_ARRAY:
+
+/**
+ * unary expression with optional operand
+ */
+#define EXPR_UNARY_CASES_OPTIONAL \
+ case EXPR_UNARY_THROW: \
+
+#define EXPR_UNARY_CASES \
+ 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.
+ */
+struct expression_base_t {
+ 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 : 1;
+#ifndef NDEBUG
+ bool transformed : 1; /**< Set if this expression was transformed. */
+#endif
+};
+
+/**
+ * integer/float constants, character and string literals
+ */
+struct literal_expression_t {
+ expression_base_t base;
+ string_t value;
+ symbol_t *suffix;