155 lines
2.8 KiB
C
155 lines
2.8 KiB
C
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
#include "syntax.h"
|
|
|
|
bool se_istraversable(tSyntaxElement* syntaxtree) {
|
|
|
|
return syntaxtree->type == TREE && syntaxtree->content.syntax != NULL;
|
|
|
|
}
|
|
|
|
tSyntaxElement* se_create(void) {
|
|
|
|
tSyntaxElement* syntaxelement = malloc(sizeof(tSyntaxElement));
|
|
|
|
syntaxelement->type = NONE;
|
|
syntaxelement->content.none = NULL;
|
|
syntaxelement->next = NULL;
|
|
syntaxelement->top = NULL;
|
|
|
|
return syntaxelement;
|
|
|
|
}
|
|
|
|
tSyntaxElement* se_bottom(tSyntaxElement* syntaxelement) {
|
|
|
|
syntaxelement->content.syntax = se_create();
|
|
syntaxelement->content.syntax->top = syntaxelement;
|
|
|
|
return syntaxelement->content.syntax;
|
|
|
|
}
|
|
|
|
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.syntax != NULL) {
|
|
se_free(syntaxtree->content.syntax);
|
|
}
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
free(syntaxtree->content.none);
|
|
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.syntax != NULL)
|
|
clone->content.syntax = se_clone(syntaxelement->content.syntax, 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.string = malloc(strlen(syntaxelement->content.string));
|
|
strcpy(clone->content.string, syntaxelement->content.string);
|
|
|
|
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;
|
|
|
|
}
|
|
|
|
tSyntaxElement* se_find_last(tSyntaxElement* syntaxelement) {
|
|
tSyntaxElement* i = syntaxelement;
|
|
while (1)
|
|
if (i->next == NULL)
|
|
return i;
|
|
else
|
|
i = i->next;
|
|
}
|
|
|