X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ast_t.h;h=f7598b8d9729da5e51592233a60752a988d91d2f;hb=8e32d3ef5acf95570f32c8f7a6c64e897170bdf6;hp=50d0b6d28c6ecc113bfaf83216410d8f8ab0d17d;hpb=8da6cc72f83aabec66aa9bd92a5ecdcbf6b2c06a;p=cparser diff --git a/ast_t.h b/ast_t.h index 50d0b6d..f7598b8 100644 --- a/ast_t.h +++ b/ast_t.h @@ -2,6 +2,7 @@ #define AST_T_H #include +#include #include "ast.h" #include "symbol.h" @@ -153,6 +154,7 @@ struct array_access_expression_t { expression_t expression; expression_t *array_ref; expression_t *index; + bool flipped; /* index/ref was written in a 5[a] way */ }; struct sizeof_expression_t { @@ -217,22 +219,36 @@ typedef enum { typedef enum { INITIALIZER_VALUE, INITIALIZER_LIST, - INITIALIZER_STRING + INITIALIZER_STRING, + INITIALIZER_COUNT } initializer_type_t; -struct initializer_t { - initializer_type_t type; - union { - /* if type == INITIALIZER_VALUE */ - expression_t *value; - /* if type == INITIALIZER_LIST */ - struct { - size_t len; - initializer_t *initializers[1]; - } list; - /* if type == INITIALIZER_STRING */ - const char *string; - } v; +struct initializer_base_t { + initializer_type_t type; +}; + +struct initializer_value_t { + initializer_base_t initializer; + expression_t *value; +}; + +struct initializer_list_t { + initializer_base_t initializer; + size_t len; + initializer_t *initializers[]; +}; + +struct initializer_string_t { + initializer_base_t initializer; + const char *string; +}; + +union initializer_t { + initializer_type_t type; + initializer_base_t base; + initializer_value_t value; + initializer_list_t list; + initializer_string_t string; }; struct declaration_t { @@ -262,6 +278,7 @@ struct declaration_t { unsigned int value_number; /* used in ast2firm module */ ir_entity *entity; /* used in ast2firm module */ ir_node *block; /* used in ast2firm module */ + tarval *enum_val; /* used in ast2firm module */ } v; }; @@ -287,58 +304,79 @@ struct statement_t { statement_type_t type; statement_t *next; source_position_t source_position; - union { - /* if type == STATEMENT_COMPOUND */ - struct { - statement_t *statements; - context_t context; - } compound_stmt; - /* if type == STATEMENT_RETURN */ - expression_t *return_value; - /* if type == STATEMENT_DECLARATION */ - struct { - declaration_t *begin; - declaration_t *end; - } declaration_stmt; - /* if type == STATEMENT_IF */ - struct { - expression_t *condition; - statement_t *true_statement; - statement_t *false_statement; - } if_stmt; - /* if type == STATEMENT_SWITCH */ - struct { - expression_t *expression; - statement_t *body; - } switch_stmt; - /* if type == STATEMENT_EXPRESSION */ - expression_t *expression; - /* if type == STATEMENT_GOTO */ - declaration_t *goto_label; - /* if type == STATEMENT_LABEL */ - struct { - declaration_t *label; - statement_t *label_statement; - } label_stmt; - /* if type == STATEMENT_CASE_LABEL */ - struct { - expression_t *expression; - statement_t *label_statement; - } case_label_stmt; - /* if type == STATEMENT_WHILE or STATEMENT_DO_WHILE */ - struct { - expression_t *condition; - statement_t *body; - } while_stmt; - /* if type == STATEMENT_FOR */ - struct { - expression_t *initialisation; - expression_t *condition; - expression_t *step; - statement_t *body; - context_t context; - } for_stmt; - } v; +}; + +struct return_statement_t { + statement_t statement; + expression_t *return_value; +}; + +struct compound_statement_t { + statement_t statement; + statement_t *statements; + context_t context; +}; + +struct declaration_statement_t { + statement_t statement; + declaration_t *declarations_begin; + declaration_t *declarations_end; +}; + +struct if_statement_t { + statement_t statement; + expression_t *condition; + statement_t *true_statement; + statement_t *false_statement; +}; + +struct switch_statement_t { + statement_t statement; + expression_t *expression; + statement_t *body; +}; + +struct goto_statement_t { + statement_t statement; + declaration_t *label; +}; + +struct case_label_statement_t { + statement_t statement; + expression_t *expression; + statement_t *label_statement; +}; + +struct label_statement_t { + statement_t statement; + declaration_t *label; + statement_t *label_statement; +}; + +struct expression_statement_t { + statement_t statement; + expression_t *expression; +}; + +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 {