diff --git a/src/main.c b/src/main.c index b8a610b..3a6b8e6 100644 --- a/src/main.c +++ b/src/main.c @@ -2,6 +2,7 @@ #include #include "parser.h" +#include "syntax.h" #include "printtree.h" diff --git a/src/parser.c b/src/parser.c index b8f8ad8..d6e56bd 100644 --- a/src/parser.c +++ b/src/parser.c @@ -3,78 +3,9 @@ #include #include -#include "parser.h" +#include "syntax.h" #include "extstring.h" -struct SyntaxElement* se_create(void) { - struct SyntaxElement* syntaxelement = malloc(sizeof(struct SyntaxElement)); - syntaxelement->type = NONE; - syntaxelement->content = NULL; - syntaxelement->next = NULL; - syntaxelement->top = NULL; - return syntaxelement; - -} - -struct SyntaxElement* se_bottom(struct SyntaxElement* syntaxelement) { - syntaxelement->content = se_create(); - ((struct SyntaxElement*)syntaxelement->content)->top = syntaxelement; - return ((struct SyntaxElement*)syntaxelement->content); -} - -struct SyntaxElement* se_next(struct SyntaxElement* syntaxelement) { - syntaxelement->next = se_create(); - syntaxelement->next->top = syntaxelement->top; - return syntaxelement->next; -} - -void se_free(struct SyntaxElement* syntaxtree) { - switch (syntaxtree->type) { - case NONE: - free(syntaxtree); - return; - case TREE: - case TOPTREE: - if (syntaxtree->content != NULL) { - se_free((struct SyntaxElement*)syntaxtree->content); - } - break; - default: - free(syntaxtree->content); - break; - } - if (syntaxtree->next != NULL) { - se_free(syntaxtree->next); - } - free(syntaxtree); -} - -// Remove NONEs from the syntax tree. -void se_clean(struct SyntaxElement* syntaxtree) { - if (syntaxtree->next != NULL) { - switch (syntaxtree->next->type) { - case NONE: - free(syntaxtree->next); - syntaxtree->next = NULL; - break; - default: - se_clean(syntaxtree->next); - break; - } - } - if (syntaxtree->content != NULL && (syntaxtree->type == TOPTREE || syntaxtree->type == TREE)) { - switch (((struct SyntaxElement*)syntaxtree->content)->type) { - case NONE: - free(syntaxtree->content); - syntaxtree->content = NULL; - break; - default: - se_clean((struct SyntaxElement*)syntaxtree->content); - break; - } - } -} - struct SyntaxElement* parse(FILE* file) { struct SyntaxElement* syntaxtree = se_create(); struct SyntaxElement* syntaxtreestart = syntaxtree; diff --git a/src/parser.h b/src/parser.h index 55cb73f..284b659 100644 --- a/src/parser.h +++ b/src/parser.h @@ -1,27 +1,3 @@ #include -#ifndef PARSER_H -#define PARSER_H -struct SyntaxElement* se_init(void); -struct SyntaxElement* se_bottom(struct SyntaxElement* syntaxelement); -struct SyntaxElement* se_next(struct SyntaxElement* syntaxelement); -void se_free(struct SyntaxElement* syntaxtree); - -enum SyntaxElementType { - TOPTREE, - TREE, - TOKEN, - STRING, - NUMBER, - NONE -}; - -struct SyntaxElement { - enum SyntaxElementType type; - void* content; - struct SyntaxElement* next; - struct SyntaxElement* top; -}; - struct SyntaxElement* parse(FILE* file); -#endif diff --git a/src/printtree.c b/src/printtree.c index 4bf73c3..206e467 100644 --- a/src/printtree.c +++ b/src/printtree.c @@ -1,7 +1,7 @@ #include #include -#include "parser.h" +#include "syntax.h" void printtree(struct SyntaxElement* syntaxtree, int depth) { if (syntaxtree == NULL) diff --git a/src/syntax.c b/src/syntax.c new file mode 100644 index 0000000..ca83d25 --- /dev/null +++ b/src/syntax.c @@ -0,0 +1,73 @@ +#include + +#include "syntax.h" + +struct SyntaxElement* se_create(void) { + struct SyntaxElement* syntaxelement = malloc(sizeof(struct SyntaxElement)); + syntaxelement->type = NONE; + syntaxelement->content = NULL; + syntaxelement->next = NULL; + syntaxelement->top = NULL; + return syntaxelement; + +} + +struct SyntaxElement* se_bottom(struct SyntaxElement* syntaxelement) { + syntaxelement->content = se_create(); + ((struct SyntaxElement*)syntaxelement->content)->top = syntaxelement; + return ((struct SyntaxElement*)syntaxelement->content); +} + +struct SyntaxElement* se_next(struct SyntaxElement* syntaxelement) { + syntaxelement->next = se_create(); + syntaxelement->next->top = syntaxelement->top; + return syntaxelement->next; +} + +void se_free(struct SyntaxElement* syntaxtree) { + switch (syntaxtree->type) { + case NONE: + free(syntaxtree); + return; + case TREE: + case TOPTREE: + if (syntaxtree->content != NULL) { + se_free((struct SyntaxElement*)syntaxtree->content); + } + break; + default: + free(syntaxtree->content); + break; + } + if (syntaxtree->next != NULL) { + se_free(syntaxtree->next); + } + free(syntaxtree); +} + +// Remove NONEs from the syntax tree. +void se_clean(struct SyntaxElement* syntaxtree) { + if (syntaxtree->next != NULL) { + switch (syntaxtree->next->type) { + case NONE: + free(syntaxtree->next); + syntaxtree->next = NULL; + break; + default: + se_clean(syntaxtree->next); + break; + } + } + if (syntaxtree->content != NULL && (syntaxtree->type == TOPTREE || syntaxtree->type == TREE)) { + switch (((struct SyntaxElement*)syntaxtree->content)->type) { + case NONE: + free(syntaxtree->content); + syntaxtree->content = NULL; + break; + default: + se_clean((struct SyntaxElement*)syntaxtree->content); + break; + } + } +} + diff --git a/src/syntax.h b/src/syntax.h new file mode 100644 index 0000000..eaac577 --- /dev/null +++ b/src/syntax.h @@ -0,0 +1,25 @@ +#ifndef SYNTAX_H +#define SYNTAX_H +enum SyntaxElementType { + TOPTREE, + TREE, + TOKEN, + STRING, + NUMBER, + NONE +}; + +struct SyntaxElement { + enum SyntaxElementType type; + void* content; + struct SyntaxElement* next; + struct SyntaxElement* top; +}; + +void se_clean(struct SyntaxElement* syntaxtree); +struct SyntaxElement* se_create(void); +struct SyntaxElement* se_init(void); +struct SyntaxElement* se_bottom(struct SyntaxElement* syntaxelement); +struct SyntaxElement* se_next(struct SyntaxElement* syntaxelement); +void se_free(struct SyntaxElement* syntaxtree); +#endif