From 38942c34a497a4c6edf080dc64440c1bc486fc46 Mon Sep 17 00:00:00 2001 From: Elis Eriksson Date: Sat, 20 Jun 2026 20:12:29 +0200 Subject: Pattern matching optimizer and more it's not the best optimizer but it works. Also added a -ast_dump flag which dumps the AST to stderr. Also input is now done in raw mode just because it can be. --- src/ast_dump.c | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 src/ast_dump.c (limited to 'src/ast_dump.c') diff --git a/src/ast_dump.c b/src/ast_dump.c new file mode 100644 index 0000000..0224c09 --- /dev/null +++ b/src/ast_dump.c @@ -0,0 +1,68 @@ +#include "all.h" +#include +#include + +static const char *type_name(ast_type_e type) { + switch (type) { + case AST_INC: + return "INC"; + case AST_DEC: + return "DEC"; + case AST_PTR_INC: + return "PTR_INC"; + case AST_PTR_DEC: + return "PTR_DEC"; + case AST_OUT: + return "OUT"; + case AST_IN: + return "IN"; + case AST_LOOP: + return "LOOP"; + case AST_CLEAR: + return "CLEAR"; + default: + return "?"; + } +} + +void ast_dump(ast_node_t *node, int depth) { + while (node) { + + for (int i = 0; i < depth; i++) + fprintf(stderr, " "); + + fprintf(stderr, "%s(%dx / %zu len)", type_name(node->type), node->val, + node->children.len); + + switch (node->type) { + case AST_INC: + case AST_DEC: + case AST_PTR_INC: + case AST_PTR_DEC: + break; + + default: + break; + } + + fprintf(stderr, "\n"); + + if (node->type == AST_LOOP) { + + for (int i = 0; i < depth; i++) + fprintf(stderr, " "); + + fprintf(stderr, "{\n"); + + for (int i = 0; i < node->children.len; i++) + ast_dump(node->children._data[i], depth + 1); + + for (size_t i = 0; i < depth; i++) + fprintf(stderr, " "); + + fprintf(stderr, "}\n"); + } + + node = node->next; + } +} -- cgit v1.3-7-ge9ab