summaryrefslogtreecommitdiff
path: root/src/main.c
diff options
context:
space:
mode:
authorQuinn Stephens <quinn@osmora.org>2025-06-09 21:49:07 -0400
committerQuinn Stephens <quinn@osmora.org>2025-06-09 21:49:07 -0400
commit065d60fc962136d03a8a74eb235901aa14d87593 (patch)
tree0c70b18522c1bcb0288db886d7a9b429481b6121 /src/main.c
parent6ff31c0dbf2f5485604936de3e6457794554fb75 (diff)
parser: Store symbols in a hashmap
Signed-off-by: Quinn Stephens <quinn@osmora.org>
Diffstat (limited to 'src/main.c')
-rw-r--r--src/main.c39
1 files changed, 36 insertions, 3 deletions
diff --git a/src/main.c b/src/main.c
index 6487e03..645656c 100644
--- a/src/main.c
+++ b/src/main.c
@@ -31,13 +31,43 @@
#include "lexer.h"
#include "log.h"
#include "parser.h"
+#include "parser/ast.h"
static const char *src = "void test();\nint main();";
+static void
+print_func(struct ast_node *func)
+{
+ log_debug("found function \"%.*s\" (return type %s)\n", func->name_len, func->name, func->type->name);
+}
+
+static void
+print_syms(struct hashmap *syms)
+{
+ struct list *list;
+ struct ast_node *node;
+
+ /* Iterate hashmap rows */
+ for (size_t r = 0; r < syms->row_count; r++) {
+ /* Iterate row entries */
+ list = &syms->rows[r];
+ node = (struct ast_node *)list->head;
+ while (node != (struct ast_node *)list) {
+ if (node->kind == NOK_FUNCTION) {
+ print_func(node);
+ }
+
+ node = (struct ast_node *)node->hashmap_entry.list_entry.next;
+ }
+ }
+}
+
int
main(int argc, char **argv)
{
struct lexer lexer;
+ struct parser parser;
+ bool success;
(void)argc;
(void)argv;
@@ -47,9 +77,12 @@ main(int argc, char **argv)
return EXIT_FAILURE;
}
- if (!parser_parse(&lexer)) {
- return EXIT_FAILURE;
+ parser.lexer = &lexer;
+ parser.syms.rows = NULL;
+ success = parser_parse(&parser);
+ if (parser.syms.rows != NULL) {
+ print_syms(&parser.syms);
}
- return EXIT_SUCCESS;
+ return success ? EXIT_SUCCESS:EXIT_FAILURE;
}