foxp/src/syntax.c

98 lines
2.5 KiB
C

#include <stdlib.h>
#include <string.h>
#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) {
if (syntaxelement->type != NEWTREE) {
syntaxelement->next = se_create();
syntaxelement->next->top = syntaxelement->top;
return syntaxelement->next;
} else {
return syntaxelement;
}
}
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);
}
tSyntaxElement* se_clone(tSyntaxElement* syntaxelement, tSyntaxElement* newtop) {
tSyntaxElement* clone = NULL;
switch (syntaxelement->type) {
case TREE:
clone = se_create();
clone->type = TREE;
if (syntaxelement->content != NULL)
clone->content = se_clone(syntaxelement->content, clone);
if (syntaxelement->next != NULL)
clone->next = se_clone(syntaxelement->next, newtop);
break;
case TOKEN:
case STRING:
clone = se_create();
clone->type = syntaxelement->type;
clone->content = malloc(strlen(syntaxelement->content));
strcpy(clone->content, syntaxelement->content);
if (syntaxelement->next != NULL)
clone->next = se_clone(syntaxelement->next, newtop);
break;
case NONE:
case NEWTREE:
clone = se_create();
clone->type = syntaxelement->type;
clone->top = newtop;
if (syntaxelement->next != NULL)
clone->next = se_clone(syntaxelement->next, newtop);
break;
}
return clone;
}
tSyntaxElement* se_clone_no_next(tSyntaxElement* syntaxelement, tSyntaxElement* newtop) {
tSyntaxElement* se = malloc(sizeof(tSyntaxElement));
se->content = syntaxelement->content;
se->top = syntaxelement->top;
se->type = syntaxelement->type;
se->next = NULL;
tSyntaxElement* clone = se_clone(se, newtop);
free(se);
return clone;
}