return;
}
+
+struct declaration *declaration_new(void)
+{
+ struct declaration *decl;
+
+ decl = malloc(sizeof(*decl));
+
+ if(decl) {
+ memset(decl, 0, sizeof(*decl));
+ }
+
+ return(decl);
+}
+
+void declaration_free(struct declaration *decl)
+{
+ if(decl->declspecs) {
+ declaration_specifiers_free(decl->declspecs);
+ }
+
+ if(decl->initdecls) {
+ init_declarator_list_free(decl->initdecls);
+ }
+
+ memset(decl, 0, sizeof(*decl));
+ free(decl);
+
+ return;
+}
+
+struct init_declarator *init_declarator_new(void)
+{
+ struct init_declarator *decl;
+
+ decl = malloc(sizeof(*decl));
+
+ if(decl) {
+ memset(decl, 0, sizeof(*decl));
+ }
+
+ return(decl);
+}
+
+void init_declarator_free(struct init_declarator *decl)
+{
+ if(decl->decl) {
+ declarator_free(decl->decl);
+ }
+
+ if(decl->init) {
+ initializer_free(decl->init);
+ }
+
+ memset(decl, 0, sizeof(*decl));
+ free(decl);
+
+ return;
+}
+
+struct init_declarator_list *init_declarator_list_new(void)
+{
+ struct init_declarator_list *list;
+
+ list = malloc(sizeof(*list));
+
+ if(list) {
+ memset(list, 0, sizeof(*list));
+ }
+
+ return(list);
+}
+
+void init_declarator_list_free(struct init_declarator_list *list)
+{
+ if(list->decl) {
+ init_declarator_free(list->decl);
+ }
+
+ if(list->next) {
+ init_declarator_list_free(list->next);
+ }
+
+ memset(list, 0, sizeof(*list));
+ free(list);
+
+ return;
+}
+
+struct declaration_list *declaration_list_new(void)
+{
+ struct declaration_list *list;
+
+ list = malloc(sizeof(*list));
+
+ if(list) {
+ memset(list, 0, sizeof(*list));
+ }
+
+ return(list);
+}
+
+void declaration_list_free(struct declaration_list *list)
+{
+ if(list->decl) {
+ declaration_free(list->decl);
+ }
+
+ if(list->next) {
+ declaration_list_free(list->next);
+ }
+
+ memset(list, 0, sizeof(*list));
+ free(list);
+
+ return;
+}
+
+struct initializer *initializer_new(void)
+{
+ struct initializer *init;
+
+ init = malloc(sizeof(*init));
+
+ if(init) {
+ memset(init, 0, sizeof(*init));
+ }
+
+ return(init);
+}
+
+void initializer_free(struct initializer *init)
+{
+ if(init->aexpr) {
+ assignment_expression_free(init->aexpr);
+ }
+
+ if(init->list) {
+ initializer_list_free(init->list);
+ }
+
+ memset(init, 0, sizeof(*init));
+ free(init);
+
+ return;
+}
+
+struct initializer_list *initializer_list_new(void)
+{
+ struct initializer_list *list;
+
+ list = malloc(sizeof(*list));
+
+ if(list) {
+ memset(list, 0, sizeof(*list));
+ }
+
+ return(list);
+}
+
+void initializer_list_free(struct initializer_list *list)
+{
+ if(list->init) {
+ initializer_free(list->init);
+ }
+
+ if(list->next) {
+ initializer_list_free(list->next);
+ }
+
+ memset(list, 0, sizeof(*list));
+ free(list);
+
+ return;
+}
+
+void goto_statement_debug(struct goto_statement *stmt)
+{
+ printf("%s %s ;\n",
+ stmt->tgoto ? token_value(stmt->tgoto) : "(null)",
+ stmt->identifier ? token_value(stmt->identifier->token) : "(null)");
+
+ return;
+}
+
+void jump_statement_debug(struct jump_statement *stmt)
+{
+ printf("jump_statement\n");
+
+ if(stmt->gotostmt) {
+ goto_statement_debug(stmt->gotostmt);
+ } /*else if(stmt->continuestmt) {
+ continue_statement_debug(stmt->continuestmt);
+ } else if(stmt->breakstmt) {
+ break_statement_debug(stmt->breakstmt);
+ } else if(stmt->returnstmt) {
+ return_statement_debug(stmt->returnstmt);
+ } */ else {
+ printf(" INVALID\n");
+ }
+
+ return;
+}
struct compound_statement *stmts;
};
+struct initializer_list {
+ struct initializer *init;
+ struct initializer_list *next;
+ struct token *comma;
+};
+
+struct initializer {
+ struct assignment_expression *aexpr;
+ struct initializer_list *list;
+ struct token *lbrace;
+ struct token *rbrace;
+ struct token *comma;
+};
+
+struct init_declarator {
+ struct declarator *decl;
+ struct initializer *init;
+ struct token *equals;
+};
+
+struct init_declarator_list {
+ struct init_declarator *decl;
+ struct init_declarator_list *next;
+ struct token *comma;
+};
+
struct declaration {
struct declaration_specifiers *declspecs;
struct init_declarator_list *initdecls;
struct declaration_list *declaration_list_new(void);
void declaration_list_free(struct declaration_list*);
+struct initializer *initializer_new(void);
+void initializer_free(struct initializer*);
+
+struct init_declarator* init_declarator_new(void);
+void init_declarator_free(struct init_declarator*);
+
+struct init_declarator_list *init_declarator_list_new(void);
+void init_declarator_list_free(struct init_declarator_list*);
+
+struct initializer_list *initializer_list_new(void);
+void initializer_list_free(struct initializer_list*);
+
+void jump_statement_debug(struct jump_statement*);
+
#endif /* GRAMMAR_H */