#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: 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 == TREE)) { switch (((struct SyntaxElement*)syntaxtree->content)->type) { case NONE: free(syntaxtree->content); syntaxtree->content = NULL; break; default: se_clean((struct SyntaxElement*)syntaxtree->content); break; } } }