]> git.corax.cc Git - ccc/commitdiff
grammar: Add types for remaining grammatical structures
authorMatthias Kruk <m@m10k.eu>
Sat, 18 Jul 2020 04:25:44 +0000 (13:25 +0900)
committerMatthias Kruk <m@m10k.eu>
Sat, 18 Jul 2020 04:25:44 +0000 (13:25 +0900)
src/grammar.c
src/grammar.h

index 27bafabc7d2783136c9d5f199b3fb6e56a64e7c2..7870e71879dc58b18b3aaa8398c6a58539bad542 100644 (file)
@@ -2398,3 +2398,205 @@ void jump_statement_free(struct jump_statement *stmt)
 
        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;
+}
index 6f0328401d6f1b59c724239711b65f9034dd16fa..4c27c39ad92b2389fda33e0d5d6887d072899b6e 100644 (file)
@@ -623,6 +623,32 @@ struct function_definition {
        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;
@@ -861,4 +887,18 @@ void declaration_free(struct declaration*);
 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 */