From c69929cc501203829082b810bafe75a22947e00c Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Tue, 19 Apr 2022 10:41:32 -0300 Subject: Add viz for symbol tables --- src/viz.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) (limited to 'src/viz.c') diff --git a/src/viz.c b/src/viz.c index d519d2c..c3b05f9 100644 --- a/src/viz.c +++ b/src/viz.c @@ -170,3 +170,63 @@ viz_ast(Root *roots) { printf("}\n"); } +void +viz_symtables(Scope **scopes) { + printf("digraph symtables {\n"); + printf("rankdir=RL;\n"); + printf("ranksep=\"0.95 equally\";\n"); + printf("nodesep=\"0.5 equally\";\n"); + printf("overlap=scale;\n"); + for (size_t i = 0; i < array_size(scopes); ++i) { + Scope *scope = scopes[i]; + if (array_size(scope->symbols->pairs) == 0) { + continue; + } + printf("%zu [shape=none,label=<", scope->id); + printf("\n"); + printf(""); + for (size_t j = 0; j < array_cap(scope->symbols->pairs); ++j) { + HashTablePair pair = scope->symbols->pairs[j]; + if (pair.key == NULL) { + continue; + } + Symbol *sym = pair.value; + printf(""); + printf(""); + switch (sym->type) { + case SYMBOL_VAR: { + printf(""); + printf(""); + } break; + case SYMBOL_FUN: { + printf(""); + printf(""); + } break; + } + printf("\n"); + } + printf("
NAMEKINDTYPE
"); + print_node(sym->name); + printf("var"); + print_node(sym->var.type); + printf("fun"); + printf("("); + size_t n_params = array_size(sym->fun.param_types); + for (size_t k = 0; k < n_params; ++k) { + print_node(sym->fun.param_types[k]); + if (k < n_params - 1) { + printf(" "); + } + } + printf(")"); + printf(":"); + print_node(sym->fun.return_type); + printf("
\n"); + printf(">];\n"); + + if (scope->parent != NULL) { + printf("%zu -> %zu\n", scope->id, scope->parent->id); + } + } + printf("}\n"); +} -- cgit v1.2.1