diff options
author | Bad Diode <bd@badd10de.dev> | 2024-06-21 18:20:35 +0200 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2024-06-21 18:20:35 +0200 |
commit | 835f4d9f23f55a973d76ae9384b7b9d75da5472b (patch) | |
tree | 8e817452f8437db07688cb6e63a1a73bcce543eb /src/main.c | |
parent | 5a25eeefd13b0e1988ecaf7e497ebde81e71bb2e (diff) | |
download | bdl-835f4d9f23f55a973d76ae9384b7b9d75da5472b.tar.gz bdl-835f4d9f23f55a973d76ae9384b7b9d75da5472b.zip |
Remove old files no longer needed as reference
Diffstat (limited to 'src/main.c')
-rw-r--r-- | src/main.c | 95 |
1 files changed, 89 insertions, 6 deletions
@@ -30,13 +30,20 @@ typedef enum { | |||
30 | SYM_PARAM, | 30 | SYM_PARAM, |
31 | SYM_ENUM, | 31 | SYM_ENUM, |
32 | SYM_ENUM_FIELD, | 32 | SYM_ENUM_FIELD, |
33 | SYM_STRUCT, | ||
34 | SYM_STRUCT_FIELD, | ||
33 | } SymbolKind; | 35 | } SymbolKind; |
34 | 36 | ||
35 | Str sym_kind_str[] = { | 37 | Str sym_kind_str[] = { |
36 | [SYM_UNKNOWN] = cstr("UNKNOWN "), [SYM_BUILTIN] = cstr("BUILTIN "), | 38 | [SYM_UNKNOWN] = cstr("UNKNOWN "), |
37 | [SYM_FUN] = cstr("FUNCTION "), [SYM_VAR] = cstr("VARIABLE "), | 39 | [SYM_BUILTIN] = cstr("BUILTIN "), |
38 | [SYM_PARAM] = cstr("PARAMETER "), [SYM_ENUM] = cstr("ENUM "), | 40 | [SYM_FUN] = cstr("FUNCTION "), |
39 | [SYM_ENUM_FIELD] = cstr("ENUM FIELD"), | 41 | [SYM_VAR] = cstr("VARIABLE "), |
42 | [SYM_PARAM] = cstr("PARAMETER "), | ||
43 | [SYM_ENUM] = cstr("ENUM "), | ||
44 | [SYM_ENUM_FIELD] = cstr("ENUM FIELD "), | ||
45 | [SYM_STRUCT] = cstr("STRUCT "), | ||
46 | [SYM_STRUCT_FIELD] = cstr("STRUCT FIELD "), | ||
40 | }; | 47 | }; |
41 | 48 | ||
42 | typedef struct Symbol { | 49 | typedef struct Symbol { |
@@ -85,6 +92,69 @@ find_symbol(Scope *scope, Str symbol) { | |||
85 | } | 92 | } |
86 | 93 | ||
87 | void | 94 | void |
95 | graph_scope(Scope *scope, Arena a) { | ||
96 | if (!scope->symbols) { | ||
97 | return; | ||
98 | } | ||
99 | SymbolMapIter iter = symmap_iterator(scope->symbols, &a); | ||
100 | SymbolMap *sym = symmap_next(&iter, &a); | ||
101 | print( | ||
102 | "%d[shape=\"none\" label=<\ | ||
103 | <TABLE ALIGN=\"left\" STYLE=\"rounded\" BORDER=\"1\" CELLBORDER=\"0\" CELLSPACING=\"0\" CELLPADDING=\"6\" COLUMNS=\"*\">\ | ||
104 | <TR style=\"rounded\" ><TD COLSPAN=\"2\">ID: %d</TD></TR>", | ||
105 | scope->id, scope->id); | ||
106 | print( | ||
107 | "<TR ><TD ALIGN=\"left\" > NAME</TD><TD ALIGN=\"left\" > " | ||
108 | "KIND</TD></TR>"); | ||
109 | while (sym) { | ||
110 | print( | ||
111 | "<TR><TD ALIGN=\"left\"> %s </TD><TD ALIGN=\"left\"> %s </TD></TR>", | ||
112 | sym->val.name, sym_kind_str[sym->val.kind]); | ||
113 | SymbolMapIter field_iter = symmap_iterator(sym->val.fields, &a); | ||
114 | SymbolMap *field = symmap_next(&field_iter, &a); | ||
115 | while (field) { | ||
116 | print( | ||
117 | "<TR><TD ALIGN=\"left\"> %s.%s </TD><TD ALIGN=\"left\"> %s " | ||
118 | "</TD></TR>", | ||
119 | sym->val.name, field->val.name, sym_kind_str[field->val.kind]); | ||
120 | field = symmap_next(&field_iter, &a); | ||
121 | } | ||
122 | sym = symmap_next(&iter, &a); | ||
123 | } | ||
124 | println("</TABLE>>];"); | ||
125 | sz this_id = scope->id; | ||
126 | while (scope->parent) { | ||
127 | if (scope->parent->symbols) { | ||
128 | println("%d:n->%d:s;", this_id, scope->parent->id); | ||
129 | break; | ||
130 | } else { | ||
131 | scope = scope->parent; | ||
132 | } | ||
133 | } | ||
134 | } | ||
135 | |||
136 | void | ||
137 | graph_symbols(Scope **scopes, Arena a) { | ||
138 | if (scopes == NULL) return; | ||
139 | println("digraph symbols {"); | ||
140 | println("rankdir=BT;"); | ||
141 | println("ranksep=\"0.95 equally\";"); | ||
142 | println("nodesep=\"0.5 equally\";"); | ||
143 | println("overlap=scale;"); | ||
144 | println("bgcolor=\"transparent\";"); | ||
145 | for (sz i = 0; i < array_size(scopes); i++) { | ||
146 | Scope *scope = scopes[i]; | ||
147 | if (!scope) { | ||
148 | continue; | ||
149 | } | ||
150 | println("subgraph %d {", i); | ||
151 | graph_scope(scope, a); | ||
152 | println("}"); | ||
153 | } | ||
154 | println("}"); | ||
155 | } | ||
156 | |||
157 | void | ||
88 | analyzer_symbols(Analyzer *a, Node *node, Scope *scope) { | 158 | analyzer_symbols(Analyzer *a, Node *node, Scope *scope) { |
89 | assert(a); | 159 | assert(a); |
90 | assert(scope); | 160 | assert(scope); |
@@ -158,6 +228,7 @@ analyzer_symbols(Analyzer *a, Node *node, Scope *scope) { | |||
158 | analyzer_symbols(a, expr, next); | 228 | analyzer_symbols(a, expr, next); |
159 | } | 229 | } |
160 | } break; | 230 | } break; |
231 | case NODE_STRUCT: | ||
161 | case NODE_ENUM: { | 232 | case NODE_ENUM: { |
162 | Str symbol = node->value.str; | 233 | Str symbol = node->value.str; |
163 | if (symmap_lookup(&scope->symbols, symbol) != NULL) { | 234 | if (symmap_lookup(&scope->symbols, symbol) != NULL) { |
@@ -168,7 +239,10 @@ analyzer_symbols(Analyzer *a, Node *node, Scope *scope) { | |||
168 | } | 239 | } |
169 | SymbolMap *map = symmap_insert( | 240 | SymbolMap *map = symmap_insert( |
170 | &scope->symbols, symbol, | 241 | &scope->symbols, symbol, |
171 | (Symbol){.kind = SYM_ENUM, .name = symbol}, a->storage); | 242 | (Symbol){ |
243 | .kind = node->kind == NODE_ENUM ? SYM_ENUM : SYM_STRUCT, | ||
244 | .name = symbol}, | ||
245 | a->storage); | ||
172 | // TODO: symcheck the value expression? | 246 | // TODO: symcheck the value expression? |
173 | for (sz i = 0; i < array_size(node->struct_field); i++) { | 247 | for (sz i = 0; i < array_size(node->struct_field); i++) { |
174 | Node *field = node->struct_field[i]; | 248 | Node *field = node->struct_field[i]; |
@@ -179,7 +253,10 @@ analyzer_symbols(Analyzer *a, Node *node, Scope *scope) { | |||
179 | a->file_name, field->line, field->col, symbol, | 253 | a->file_name, field->line, field->col, symbol, |
180 | field_name); | 254 | field_name); |
181 | } | 255 | } |
182 | Symbol s = (Symbol){.kind = SYM_ENUM_FIELD, .name = field_name}; | 256 | Symbol s = |
257 | (Symbol){.kind = node->kind == NODE_ENUM ? SYM_ENUM_FIELD | ||
258 | : SYM_STRUCT_FIELD, | ||
259 | .name = field_name}; | ||
183 | symmap_insert(&map->val.fields, field_name, s, a->storage); | 260 | symmap_insert(&map->val.fields, field_name, s, a->storage); |
184 | } | 261 | } |
185 | } break; | 262 | } break; |
@@ -404,6 +481,11 @@ process_file(Str path) { | |||
404 | symbolic_analysis(&analyzer, &parser); | 481 | symbolic_analysis(&analyzer, &parser); |
405 | 482 | ||
406 | // Printing symbol tables. | 483 | // Printing symbol tables. |
484 | if (mode == PRINT_SYMTABLES) { | ||
485 | graph_symbols(analyzer.scopes, lexer_arena); | ||
486 | } | ||
487 | |||
488 | #if DEBUG == 1 | ||
407 | for (sz i = 0; i < array_size(analyzer.scopes); i++) { | 489 | for (sz i = 0; i < array_size(analyzer.scopes); i++) { |
408 | Arena scratch = lexer_arena; | 490 | Arena scratch = lexer_arena; |
409 | Scope *scope = analyzer.scopes[i]; | 491 | Scope *scope = analyzer.scopes[i]; |
@@ -424,6 +506,7 @@ process_file(Str path) { | |||
424 | sym = symmap_next(&iter, &lexer_arena); | 506 | sym = symmap_next(&iter, &lexer_arena); |
425 | } | 507 | } |
426 | } | 508 | } |
509 | #endif | ||
427 | 510 | ||
428 | // TODO: Type checking. | 511 | // TODO: Type checking. |
429 | 512 | ||