aboutsummaryrefslogtreecommitdiffstats
path: root/src/main.c
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2024-06-21 18:20:35 +0200
committerBad Diode <bd@badd10de.dev>2024-06-21 18:20:35 +0200
commit835f4d9f23f55a973d76ae9384b7b9d75da5472b (patch)
tree8e817452f8437db07688cb6e63a1a73bcce543eb /src/main.c
parent5a25eeefd13b0e1988ecaf7e497ebde81e71bb2e (diff)
downloadbdl-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.c95
1 files changed, 89 insertions, 6 deletions
diff --git a/src/main.c b/src/main.c
index 2bcbf39..60203d5 100644
--- a/src/main.c
+++ b/src/main.c
@@ -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
35Str sym_kind_str[] = { 37Str 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
42typedef struct Symbol { 49typedef struct Symbol {
@@ -85,6 +92,69 @@ find_symbol(Scope *scope, Str symbol) {
85} 92}
86 93
87void 94void
95graph_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
136void
137graph_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
157void
88analyzer_symbols(Analyzer *a, Node *node, Scope *scope) { 158analyzer_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