#include #include "syntax.h" bool se_istraversable(tSyntaxElement* syntaxtree) { return syntaxtree->type == TREE && syntaxtree->content != NULL; } tSyntaxElement* se_create(void) { tSyntaxElement* syntaxelement = malloc(sizeof(tSyntaxElement)); syntaxelement->type = NONE; syntaxelement->content = NULL; syntaxelement->next = NULL; syntaxelement->top = NULL; return syntaxelement; } tSyntaxElement* se_bottom(tSyntaxElement* syntaxelement) { syntaxelement->content = se_create(); ((tSyntaxElement*)syntaxelement->content)->top = syntaxelement; return ((tSyntaxElement*)syntaxelement->content); } tSyntaxElement* se_next(tSyntaxElement* syntaxelement) { syntaxelement->next = se_create(); syntaxelement->next->top = syntaxelement->top; return syntaxelement->next; } void se_free(tSyntaxElement* syntaxtree) { switch (syntaxtree->type) { case NONE: free(syntaxtree); return; case TREE: if (syntaxtree->content != NULL) { se_free((tSyntaxElement*)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(tSyntaxElement* 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 (((tSyntaxElement*)syntaxtree->content)->type) { case NONE: free(syntaxtree->content); syntaxtree->content = NULL; break; default: se_clean((tSyntaxElement*)syntaxtree->content); break; } } }