2024-06-03 18:49:56 +00:00
|
|
|
#include <stdlib.h>
|
|
|
|
|
|
|
|
#include "syntax.h"
|
|
|
|
|
2024-06-03 19:12:16 +00:00
|
|
|
bool se_istraversable(tSyntaxElement* syntaxtree) {
|
2024-06-03 19:06:51 +00:00
|
|
|
return syntaxtree->type == TREE && syntaxtree->content != NULL;
|
|
|
|
}
|
|
|
|
|
2024-06-03 19:12:16 +00:00
|
|
|
tSyntaxElement* se_create(void) {
|
|
|
|
tSyntaxElement* syntaxelement = malloc(sizeof(tSyntaxElement));
|
2024-06-03 18:49:56 +00:00
|
|
|
syntaxelement->type = NONE;
|
|
|
|
syntaxelement->content = NULL;
|
|
|
|
syntaxelement->next = NULL;
|
|
|
|
syntaxelement->top = NULL;
|
|
|
|
return syntaxelement;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2024-06-03 19:12:16 +00:00
|
|
|
tSyntaxElement* se_bottom(tSyntaxElement* syntaxelement) {
|
2024-06-03 18:49:56 +00:00
|
|
|
syntaxelement->content = se_create();
|
2024-06-03 19:12:16 +00:00
|
|
|
((tSyntaxElement*)syntaxelement->content)->top = syntaxelement;
|
|
|
|
return ((tSyntaxElement*)syntaxelement->content);
|
2024-06-03 18:49:56 +00:00
|
|
|
}
|
|
|
|
|
2024-06-03 19:12:16 +00:00
|
|
|
tSyntaxElement* se_next(tSyntaxElement* syntaxelement) {
|
2024-06-03 18:49:56 +00:00
|
|
|
syntaxelement->next = se_create();
|
|
|
|
syntaxelement->next->top = syntaxelement->top;
|
|
|
|
return syntaxelement->next;
|
|
|
|
}
|
|
|
|
|
2024-06-03 19:12:16 +00:00
|
|
|
void se_free(tSyntaxElement* syntaxtree) {
|
2024-06-03 18:49:56 +00:00
|
|
|
switch (syntaxtree->type) {
|
|
|
|
case NONE:
|
|
|
|
free(syntaxtree);
|
|
|
|
return;
|
|
|
|
case TREE:
|
|
|
|
if (syntaxtree->content != NULL) {
|
2024-06-03 19:12:16 +00:00
|
|
|
se_free((tSyntaxElement*)syntaxtree->content);
|
2024-06-03 18:49:56 +00:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
free(syntaxtree->content);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
if (syntaxtree->next != NULL) {
|
|
|
|
se_free(syntaxtree->next);
|
|
|
|
}
|
|
|
|
free(syntaxtree);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Remove NONEs from the syntax tree.
|
2024-06-03 19:12:16 +00:00
|
|
|
void se_clean(tSyntaxElement* syntaxtree) {
|
2024-06-03 18:49:56 +00:00
|
|
|
if (syntaxtree->next != NULL) {
|
|
|
|
switch (syntaxtree->next->type) {
|
|
|
|
case NONE:
|
|
|
|
free(syntaxtree->next);
|
|
|
|
syntaxtree->next = NULL;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
se_clean(syntaxtree->next);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2024-06-03 18:55:02 +00:00
|
|
|
if (syntaxtree->content != NULL && (syntaxtree->type == TREE)) {
|
2024-06-03 19:12:16 +00:00
|
|
|
switch (((tSyntaxElement*)syntaxtree->content)->type) {
|
2024-06-03 18:49:56 +00:00
|
|
|
case NONE:
|
|
|
|
free(syntaxtree->content);
|
|
|
|
syntaxtree->content = NULL;
|
|
|
|
break;
|
|
|
|
default:
|
2024-06-03 19:12:16 +00:00
|
|
|
se_clean((tSyntaxElement*)syntaxtree->content);
|
2024-06-03 18:49:56 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|