84 lines
1.6 KiB
C
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");
|
|
}
|