#include "ast.h"
#include "symbol.h"
-#include "lexer_t.h"
+#include "token_t.h"
#include "type.h"
#include "adt/obst.h"
EXPR_CALL,
EXPR_UNARY,
EXPR_BINARY,
+ EXPR_CONDITIONAL,
EXPR_SELECT,
EXPR_ARRAY_ACCESS,
EXPR_SIZEOF,
+
+ EXPR_FUNCTION,
+ EXPR_PRETTY_FUNCTION,
+ EXPR_BUILTIN_SYMBOL,
+ EXPR_OFFSETOF,
+ EXPR_VA_ARG,
+ EXPR_STATEMENT
} expresion_type_t;
+struct context_t {
+ declaration_t *declarations;
+ compound_type_t *structs;
+ compound_type_t *unions;
+ enum_type_t *enums;
+};
+
struct expression_t {
expresion_type_t type;
type_t *datatype;
struct const_t {
expression_t expression;
- int value;
+ union {
+ int int_value;
+ long double float_value;
+ } v;
};
struct string_literal_t {
const char *value;
};
+struct builtin_symbol_expression_t {
+ expression_t expression;
+ symbol_t *symbol;
+};
+
struct reference_expression_t {
- expression_t expression;
- symbol_t *symbol;
- union {
- declaration_t *declaration;
- } r;
+ expression_t expression;
+ symbol_t *symbol;
+ declaration_t *declaration;
};
struct call_argument_t {
BINEXPR_SHIFTRIGHT_ASSIGN,
BINEXPR_BITWISE_AND_ASSIGN,
BINEXPR_BITWISE_XOR_ASSIGN,
- BINEXPR_BITWISE_OR_ASSIGN
+ BINEXPR_BITWISE_OR_ASSIGN,
+ BINEXPR_COMMA
} binary_expression_type_t;
struct binary_expression_t {
};
struct select_expression_t {
- expression_t expression;
- expression_t *compound;
- symbol_t *symbol;
+ expression_t expression;
+ expression_t *compound;
+ symbol_t *symbol;
- compound_entry_t *compound_entry;
+ declaration_t *compound_entry;
};
struct array_access_expression_t {
struct sizeof_expression_t {
expression_t expression;
type_t *type;
+ expression_t *size_expression;
+};
+
+struct designator_t {
+ symbol_t *symbol;
+ expression_t *array_access;
+ designator_t *next;
+};
+
+struct offsetof_expression_t {
+ expression_t expression;
+ type_t *type;
+ designator_t *designator;
+};
+
+struct va_arg_expression_t {
+ expression_t expression;
+ expression_t *arg;
+ type_t *type;
};
struct conditional_expression_t {
expression_t *false_expression;
};
-struct expression_list_element_t {
- expression_t *expression;
- expression_t *next;
-};
-
-struct comma_expression_t {
- expression_t expression;
- expression_list_element_t *expressions;
+struct statement_expression_t {
+ expression_t expression;
+ statement_t *statement;
};
typedef enum {
STORAGE_CLASS_EXTERN,
STORAGE_CLASS_STATIC,
STORAGE_CLASS_AUTO,
- STORAGE_CLASS_REGISTER
+ STORAGE_CLASS_REGISTER,
+ STORAGE_CLASS_ENUM_ENTRY
} storage_class_t;
-struct method_parameter_t {
- method_parameter_t *next;
- symbol_t *symbol;
- type_t *type;
- int num;
+typedef enum {
+ INITIALIZER_VALUE,
+ INITIALIZER_LIST,
+} initializer_type_t;
+
+struct initializer_t {
+ initializer_type_t type;
+ designator_t *designator;
+ union {
+ initializer_t *list;
+ expression_t *value;
+ } v;
+ initializer_t *next;
};
struct declaration_t {
storage_class_t storage_class;
type_t *type;
symbol_t *symbol;
- method_parameter_t *parameters;
statement_t *statement;
+ initializer_t *initializer;
source_position_t source_position;
+ context_t context;
+
+ declaration_t *next;
};
typedef enum {
STATEMENT_INVALID,
- STATEMENT_BLOCK,
+ STATEMENT_COMPOUND,
STATEMENT_RETURN,
STATEMENT_DECLARATION,
STATEMENT_IF,
+ STATEMENT_SWITCH,
STATEMENT_EXPRESSION,
+ STATEMENT_CONTINUE,
+ STATEMENT_BREAK,
STATEMENT_GOTO,
- STATEMENT_LABEL
+ STATEMENT_LABEL,
+ STATEMENT_CASE_LABEL,
+ STATEMENT_WHILE,
+ STATEMENT_DO_WHILE,
+ STATEMENT_FOR
} statement_type_t;
struct statement_t {
expression_t *return_value;
};
-struct block_statement_t {
+struct compound_statement_t {
statement_t statement;
- statement_t *first_statement;
+ statement_t *statements;
+ context_t context;
};
struct declaration_statement_t {
statement_t statement;
- declaration_t declaration;
+ declaration_t *declarations_begin;
+ declaration_t *declarations_end;
int value_number; /**< filled in by semantic phase */
int refs;
statement_t *false_statement;
};
+struct switch_statement_t {
+ statement_t statement;
+ expression_t *expression;
+ statement_t *body;
+};
+
struct goto_statement_t {
statement_t statement;
symbol_t *label_symbol;
label_statement_t *label;
};
+struct case_label_statement_t {
+ statement_t statement;
+ expression_t *expression;
+};
+
struct label_statement_t {
statement_t statement;
symbol_t *symbol;
expression_t *expression;
};
-struct unit_entry_t {
- declaration_t declaration;
- unit_entry_t *next;
+struct while_statement_t {
+ statement_t statement;
+ expression_t *condition;
+ statement_t *body;
+};
+
+struct do_while_statement_t {
+ statement_t statement;
+ expression_t *condition;
+ statement_t *body;
+};
+
+struct for_statement_t {
+ statement_t statement;
+ expression_t *initialisation;
+ expression_t *condition;
+ expression_t *step;
+ statement_t *body;
+ context_t context;
};
struct translation_unit_t {
- unit_entry_t *entries;
+ context_t context;
};
static inline