Files
fz-lang/src/compiler/fzl_debug.c
T
2026-10-09 23:01:19 +03:00

84 lines
1.6 KiB
C

#include <compiler/fzl_debug.h>
#include <stddef.h>
#include <stdio.h>
#include <string.h>
size_t print_level(char *buf, int level)
{
int lvl = 0;
while (lvl < level)
{
buf[lvl] = '-';
lvl++;
}
buf[lvl] = '>';
return strlen(buf);
}
void print_node(fzl_node_t *node, int level)
{
char levelbuf[32];
char printbuf[256];
memset(levelbuf, 0, sizeof(levelbuf));
memset(printbuf, 0, sizeof(printbuf));
if (!node)
return;
size_t lvllen = print_level(levelbuf, level);
strcpy(printbuf, levelbuf);
switch (node->type)
{
case FZL_NODETYPE_CALL:
if (node->list.entry_count > 0)
{
printf("%s Call fn '%s' with args:\n", levelbuf,
(char *)node->token->value);
for (size_t i = 0; i < node->list.entry_count; i++)
print_node(node->list.entries[i], level + 1);
}
else
printf("%s Call fn '%s' w/o args\n", levelbuf,
(char *)node->token->value);
break;
case FZL_NODETYPE_LITERAL:
printf("%s Literal '%s'\n", levelbuf, (char *)node->token->value);
break;
case FZL_NODETYPE_BLOCK:
printf("%s Block: ", levelbuf);
if (node->list.entry_count < 1)
{
printf("<empty>\n");
break;
}
printf("\n");
for (size_t i = 0; i < node->list.entry_count; i++)
print_node(node->list.entries[i], level + 1);
break;
default:
printf("%s Secure node\n", levelbuf);
}
}
void fzl_debug_print_ast(fzl_node_t *root)
{
printf("> AST tree:\n");
fzl_node_t *curr = root;
while (curr != NULL)
{
print_node(curr, 2);
curr = curr->next;
}
printf("-> FINISH\n");
}