51 lines
1.2 KiB
C
51 lines
1.2 KiB
C
#include "lex.h"
|
|
|
|
#include <blue/ds/number.h>
|
|
#include <blue/term/print.h>
|
|
#include <ivy/lang/internal.h>
|
|
#include <ivy/lang/lex.h>
|
|
#include <stdio.h>
|
|
|
|
static void print_symbol_node(struct ivy_lexer_symbol_node *node, int depth)
|
|
{
|
|
for (int i = 0; i < depth; i++) {
|
|
fputs(" ", stdout);
|
|
}
|
|
|
|
b_printf("[cyan]%c[reset]", node->s_char);
|
|
|
|
if (node->s_id != IVY_SYM_NONE) {
|
|
b_printf(" ([magenta]%s[reset])", ivy_symbol_to_string(node->s_id));
|
|
}
|
|
|
|
b_printf("\n");
|
|
|
|
b_queue_entry *entry = b_queue_first(&node->s_children);
|
|
while (entry) {
|
|
struct ivy_lexer_symbol_node *child
|
|
= b_unbox(struct ivy_lexer_symbol_node, entry, s_entry);
|
|
|
|
print_symbol_node(child, depth + 1);
|
|
entry = b_queue_next(entry);
|
|
}
|
|
}
|
|
|
|
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_iterator *it = b_iterator_begin(lex->lex_keywords);
|
|
b_foreach_ptr(b_dict_item, item, it)
|
|
{
|
|
const b_string *kw_name = item->key;
|
|
enum ivy_keyword kw_id = b_number_get_int(item->value);
|
|
|
|
b_printf(
|
|
"([magenta]%s[reset]) = [green]%s[reset]\n",
|
|
ivy_keyword_to_string(kw_id), b_string_ptr(kw_name));
|
|
}
|
|
}
|