From 7c42bf7bc9a82b8c9aaa0c8821f6b504a387d610 Mon Sep 17 00:00:00 2001 From: Max Wash Date: Tue, 19 Nov 2024 15:22:39 +0000 Subject: [PATCH] lang: add internal debugging interface --- lang/include/ivy/lang/internal.h | 11 ++++++++ lang/internal.c | 44 ++++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+) create mode 100644 lang/include/ivy/lang/internal.h create mode 100644 lang/internal.c diff --git a/lang/include/ivy/lang/internal.h b/lang/include/ivy/lang/internal.h new file mode 100644 index 0000000..478ea0b --- /dev/null +++ b/lang/include/ivy/lang/internal.h @@ -0,0 +1,11 @@ +#ifndef IVY_LANG_INTERNAL_H_ +#define IVY_LANG_INTERNAL_H_ + +#include + +struct ivy_lexer; + +IVY_API void internal_lexer_print_symbol_tree(struct ivy_lexer *lex); +IVY_API void internal_lexer_print_keyword_dict(struct ivy_lexer *lex); + +#endif \ No newline at end of file diff --git a/lang/internal.c b/lang/internal.c new file mode 100644 index 0000000..d97c610 --- /dev/null +++ b/lang/internal.c @@ -0,0 +1,44 @@ +#include +#include "lex.h" +#include +#include +#include + +static void print_symbol_node(struct ivy_lexer_symbol_node *node, int depth) +{ + for (int i = 0; i < depth; i++) { + fputs(" ", stdout); + } + + printf("%c", node->s_char); + + if (node->s_id != IVY_SYM_NONE) { + printf(" (%s)", ivy_symbol_to_string(node->s_id)); + } + + printf("\n"); + + b_queue_iterator it; + b_queue_foreach (&it, &node->s_children) { + struct ivy_lexer_symbol_node *child = b_unbox( + struct ivy_lexer_symbol_node, it.entry, s_entry); + + print_symbol_node(child, depth + 1); + } +} + +void internal_lexer_print_symbol_tree(struct ivy_lexer* lex) +{ + print_symbol_node(lex->lex_sym_tree, -1); +} + +void internal_lexer_print_keyword_dict(struct ivy_lexer* lex) +{ + b_dict_iterator it = {0}; + b_dict_foreach(&it, lex->lex_keywords) { + const char *kw_name = it.key; + enum ivy_keyword kw_id = b_number_get_int(B_NUMBER(it.value)); + + printf("[%s] = '%s'\n", ivy_keyword_to_string(kw_id), kw_name); + } +} \ No newline at end of file