From 0d6b9a685ca5777ee5998643c2a7ecd5634db6ad Mon Sep 17 00:00:00 2001 From: Matthias Kruk Date: Sat, 18 Jul 2020 13:25:44 +0900 Subject: [PATCH] grammar: Add types for remaining grammatical structures --- src/grammar.c | 202 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/grammar.h | 40 ++++++++++ 2 files changed, 242 insertions(+) diff --git a/src/grammar.c b/src/grammar.c index 27bafab..7870e71 100644 --- a/src/grammar.c +++ b/src/grammar.c @@ -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; +} diff --git a/src/grammar.h b/src/grammar.h index 6f03284..4c27c39 100644 --- a/src/grammar.h +++ b/src/grammar.h @@ -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 */ -- 2.47.3