foxp/src/syntax.c

155 lines
2.8 KiB
C
Raw Normal View History

2024-06-03 18:49:56 +00:00
#include <stdlib.h>
2024-06-09 16:39:12 +00:00
#include <string.h>
2024-06-03 18:49:56 +00:00
#include "syntax.h"
bool se_istraversable(tSyntaxElement* syntaxtree) {
2024-06-09 20:58:38 +00:00
2024-06-09 19:38:22 +00:00
return syntaxtree->type == TREE && syntaxtree->content.syntax != NULL;
2024-06-09 20:58:38 +00:00
2024-06-03 19:06:51 +00:00
}
tSyntaxElement* se_create(void) {
2024-06-09 20:58:38 +00:00
tSyntaxElement* syntaxelement = malloc(sizeof(tSyntaxElement));
2024-06-09 20:58:38 +00:00
2024-06-03 18:49:56 +00:00
syntaxelement->type = NONE;
2024-06-09 19:38:22 +00:00
syntaxelement->content.none = NULL;
2024-06-03 18:49:56 +00:00
syntaxelement->next = NULL;
syntaxelement->top = NULL;
2024-06-09 20:58:38 +00:00
2024-06-03 18:49:56 +00:00
return syntaxelement;
}
tSyntaxElement* se_bottom(tSyntaxElement* syntaxelement) {
2024-06-09 20:58:38 +00:00
2024-06-09 19:38:22 +00:00
syntaxelement->content.syntax = se_create();
syntaxelement->content.syntax->top = syntaxelement;
2024-06-09 20:58:38 +00:00
2024-06-09 19:38:22 +00:00
return syntaxelement->content.syntax;
2024-06-09 20:58:38 +00:00
2024-06-03 18:49:56 +00:00
}
tSyntaxElement* se_next(tSyntaxElement* syntaxelement) {
2024-06-09 20:58:38 +00:00
2024-06-09 16:39:12 +00:00
if (syntaxelement->type != NEWTREE) {
2024-06-09 20:58:38 +00:00
2024-06-09 16:39:12 +00:00
syntaxelement->next = se_create();
syntaxelement->next->top = syntaxelement->top;
2024-06-09 20:58:38 +00:00
2024-06-09 16:39:12 +00:00
return syntaxelement->next;
2024-06-09 20:58:38 +00:00
} else
2024-06-09 16:39:12 +00:00
return syntaxelement;
2024-06-09 20:58:38 +00:00
2024-06-03 18:49:56 +00:00
}
void se_free(tSyntaxElement* syntaxtree) {
2024-06-09 20:58:38 +00:00
2024-06-03 18:49:56 +00:00
switch (syntaxtree->type) {
2024-06-09 20:58:38 +00:00
2024-06-03 18:49:56 +00:00
case NONE:
2024-06-09 20:58:38 +00:00
2024-06-03 18:49:56 +00:00
free(syntaxtree);
return;
2024-06-09 20:58:38 +00:00
2024-06-03 18:49:56 +00:00
case TREE:
2024-06-09 20:58:38 +00:00
2024-06-09 19:38:22 +00:00
if (syntaxtree->content.syntax != NULL) {
se_free(syntaxtree->content.syntax);
2024-06-03 18:49:56 +00:00
}
2024-06-09 20:58:38 +00:00
2024-06-03 18:49:56 +00:00
break;
2024-06-09 20:58:38 +00:00
2024-06-03 18:49:56 +00:00
default:
2024-06-09 20:58:38 +00:00
2024-06-09 19:38:22 +00:00
free(syntaxtree->content.none);
2024-06-03 18:49:56 +00:00
break;
2024-06-09 20:58:38 +00:00
2024-06-03 18:49:56 +00:00
}
2024-06-09 20:58:38 +00:00
2024-06-03 18:49:56 +00:00
if (syntaxtree->next != NULL) {
se_free(syntaxtree->next);
}
2024-06-09 20:58:38 +00:00
2024-06-03 18:49:56 +00:00
free(syntaxtree);
2024-06-09 20:58:38 +00:00
2024-06-03 18:49:56 +00:00
}
2024-06-09 16:39:12 +00:00
tSyntaxElement* se_clone(tSyntaxElement* syntaxelement, tSyntaxElement* newtop) {
2024-06-09 20:58:38 +00:00
2024-06-09 16:39:12 +00:00
tSyntaxElement* clone = NULL;
2024-06-09 20:58:38 +00:00
2024-06-09 16:39:12 +00:00
switch (syntaxelement->type) {
2024-06-09 20:58:38 +00:00
2024-06-09 16:39:12 +00:00
case TREE:
2024-06-09 20:58:38 +00:00
2024-06-09 16:39:12 +00:00
clone = se_create();
clone->type = TREE;
2024-06-09 20:58:38 +00:00
2024-06-09 19:38:22 +00:00
if (syntaxelement->content.syntax != NULL)
clone->content.syntax = se_clone(syntaxelement->content.syntax, clone);
2024-06-09 20:58:38 +00:00
2024-06-09 16:39:12 +00:00
if (syntaxelement->next != NULL)
clone->next = se_clone(syntaxelement->next, newtop);
2024-06-09 20:58:38 +00:00
2024-06-09 16:39:12 +00:00
break;
2024-06-09 20:58:38 +00:00
2024-06-09 16:39:12 +00:00
case TOKEN:
case STRING:
2024-06-09 20:58:38 +00:00
2024-06-09 16:39:12 +00:00
clone = se_create();
clone->type = syntaxelement->type;
2024-06-09 20:58:38 +00:00
2024-06-09 19:38:22 +00:00
clone->content.string = malloc(strlen(syntaxelement->content.string));
strcpy(clone->content.string, syntaxelement->content.string);
2024-06-09 20:58:38 +00:00
2024-06-09 16:39:12 +00:00
if (syntaxelement->next != NULL)
clone->next = se_clone(syntaxelement->next, newtop);
2024-06-09 20:58:38 +00:00
2024-06-09 16:39:12 +00:00
break;
2024-06-09 20:58:38 +00:00
2024-06-09 16:39:12 +00:00
case NONE:
case NEWTREE:
2024-06-09 20:58:38 +00:00
2024-06-09 16:39:12 +00:00
clone = se_create();
clone->type = syntaxelement->type;
clone->top = newtop;
2024-06-09 20:58:38 +00:00
2024-06-09 16:39:12 +00:00
if (syntaxelement->next != NULL)
clone->next = se_clone(syntaxelement->next, newtop);
2024-06-09 20:58:38 +00:00
2024-06-09 16:39:12 +00:00
break;
2024-06-03 18:49:56 +00:00
}
2024-06-09 20:58:38 +00:00
2024-06-09 16:39:12 +00:00
return clone;
2024-06-03 18:49:56 +00:00
}
2024-06-09 16:39:12 +00:00
tSyntaxElement* se_clone_no_next(tSyntaxElement* syntaxelement, tSyntaxElement* newtop) {
2024-06-09 20:58:38 +00:00
2024-06-09 16:39:12 +00:00
tSyntaxElement* se = malloc(sizeof(tSyntaxElement));
2024-06-09 20:58:38 +00:00
2024-06-09 16:39:12 +00:00
se->content = syntaxelement->content;
se->top = syntaxelement->top;
se->type = syntaxelement->type;
se->next = NULL;
2024-06-09 20:58:38 +00:00
2024-06-09 16:39:12 +00:00
tSyntaxElement* clone = se_clone(se, newtop);
2024-06-09 20:58:38 +00:00
2024-06-09 16:39:12 +00:00
free(se);
2024-06-09 20:58:38 +00:00
2024-06-09 16:39:12 +00:00
return clone;
2024-06-09 20:58:38 +00:00
2024-06-09 16:39:12 +00:00
}
2024-06-11 11:14:18 +00:00
tSyntaxElement* se_find_last(tSyntaxElement* syntaxelement) {
tSyntaxElement* i = syntaxelement;
while (1)
if (i->next == NULL)
return i;
else
i = i->next;
}