diff options
author | Bad Diode <bd@badd10de.dev> | 2022-04-19 10:41:32 -0300 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2022-04-19 10:41:32 -0300 |
commit | c69929cc501203829082b810bafe75a22947e00c (patch) | |
tree | 46dceba9e657a424626ab97f510b49d3b2b889cf /src/viz.c | |
parent | 7cf1451ab52586ed9c4eeae1b1ec3b4ebaa83393 (diff) | |
download | bdl-c69929cc501203829082b810bafe75a22947e00c.tar.gz bdl-c69929cc501203829082b810bafe75a22947e00c.zip |
Add viz for symbol tables
Diffstat (limited to 'src/viz.c')
-rw-r--r-- | src/viz.c | 60 |
1 files changed, 60 insertions, 0 deletions
@@ -170,3 +170,63 @@ viz_ast(Root *roots) { | |||
170 | printf("}\n"); | 170 | printf("}\n"); |
171 | } | 171 | } |
172 | 172 | ||
173 | void | ||
174 | viz_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 | } | ||