aboutsummaryrefslogtreecommitdiffstats
path: root/src/viz.c
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2022-04-19 10:41:32 -0300
committerBad Diode <bd@badd10de.dev>2022-04-19 10:41:32 -0300
commitc69929cc501203829082b810bafe75a22947e00c (patch)
tree46dceba9e657a424626ab97f510b49d3b2b889cf /src/viz.c
parent7cf1451ab52586ed9c4eeae1b1ec3b4ebaa83393 (diff)
downloadbdl-c69929cc501203829082b810bafe75a22947e00c.tar.gz
bdl-c69929cc501203829082b810bafe75a22947e00c.zip
Add viz for symbol tables
Diffstat (limited to 'src/viz.c')
-rw-r--r--src/viz.c60
1 files changed, 60 insertions, 0 deletions
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) {
170 printf("}\n"); 170 printf("}\n");
171} 171}
172 172
173void
174viz_symtables(Scope **scopes) {
175 printf("digraph symtables {\n");
176 printf("rankdir=RL;\n");
177 printf("ranksep=\"0.95 equally\";\n");
178 printf("nodesep=\"0.5 equally\";\n");
179 printf("overlap=scale;\n");
180 for (size_t i = 0; i < array_size(scopes); ++i) {
181 Scope *scope = scopes[i];
182 if (array_size(scope->symbols->pairs) == 0) {
183 continue;
184 }
185 printf("%zu [shape=none,label=<", scope->id);
186 printf("<table border=\"1\" cellborder=\"0\">\n");
187 printf("<tr><td>NAME</td><td>KIND</td><td>TYPE</td></tr>");
188 for (size_t j = 0; j < array_cap(scope->symbols->pairs); ++j) {
189 HashTablePair pair = scope->symbols->pairs[j];
190 if (pair.key == NULL) {
191 continue;
192 }
193 Symbol *sym = pair.value;
194 printf("<tr>");
195 printf("<td>");
196 print_node(sym->name);
197 printf("</td>");
198 switch (sym->type) {
199 case SYMBOL_VAR: {
200 printf("<td>var</td>");
201 printf("<td>");
202 print_node(sym->var.type);
203 printf("</td>");
204 } break;
205 case SYMBOL_FUN: {
206 printf("<td>fun</td>");
207 printf("<td>");
208 printf("(");
209 size_t n_params = array_size(sym->fun.param_types);
210 for (size_t k = 0; k < n_params; ++k) {
211 print_node(sym->fun.param_types[k]);
212 if (k < n_params - 1) {
213 printf(" ");
214 }
215 }
216 printf(")");
217 printf(":");
218 print_node(sym->fun.return_type);
219 printf("</td>");
220 } break;
221 }
222 printf("</tr>\n");
223 }
224 printf("</table>\n");
225 printf(">];\n");
226
227 if (scope->parent != NULL) {
228 printf("%zu -> %zu\n", scope->id, scope->parent->id);
229 }
230 }
231 printf("}\n");
232}