summaryrefslogtreecommitdiff
path: root/passes
diff options
context:
space:
mode:
author0x221e <x221e@0xinfinity.dev>2026-06-22 13:18:43 +0300
committer0x221e <x221e@0xinfinity.dev>2026-06-22 13:22:10 +0300
commitad5d641ad41f415cca3cc01c88bc063319aba937 (patch)
treef03b2c0116bb41535e2fe7aa11294948b66e99c8 /passes
parent45f4a6afd2a5683fa53f9d6787e3c5b0f70229fd (diff)
downloadmetalc-master.tar.gz
parser: add unary, and binary operationsHEADmaster
lex: add bang passes: add initial debug pass
Diffstat (limited to 'passes')
-rw-r--r--passes/passdbg.c114
1 files changed, 114 insertions, 0 deletions
diff --git a/passes/passdbg.c b/passes/passdbg.c
new file mode 100644
index 0000000..334e6ea
--- /dev/null
+++ b/passes/passdbg.c
@@ -0,0 +1,114 @@
+#include <passdbg.h>
+
+#include <lib/arena.h>
+
+#include <platform/osal.h>
+#include <parser.h>
+
+#include <assert.h>
+
+static int indent_lvl = 0;
+
+#define INDENT_PRINT(x) \
+ for (int i = 0; i < indent_lvl + x; i++) \
+ print(" ")
+
+void passdbg_primary(void *n)
+{
+ assert(n != NULL);
+ struct node_primary *primary = (struct node_primary *)n;
+
+ if (primary->ntype != N_LITERAL) {
+ print("passdbg_primary(): node not literal!");
+ exitc(1);
+ }
+
+ INDENT_PRINT(0);
+ print("Primary Node: (%s)\n", primary->is_number ? "Number" : "String");
+ INDENT_PRINT(2);
+ switch (primary->is_number) {
+ case 0:
+ print("Content: %s\n", primary->value.str);
+ break;
+ case 1:
+ print("Content: %d\n", primary->value.number);
+ break;
+ default:
+ print("error: unrecognized type for passdbg_primary()");
+ exitc(1);
+ break;
+ }
+}
+
+void passdbg_unary(void *n)
+{
+ assert(n != NULL);
+
+ struct node_unary *unary = (struct node_unary *)n;
+
+ if (unary->ntype == N_LITERAL) {
+ passdbg_primary(n);
+ return;
+ }
+
+ if (unary->ntype != N_UNARY) {
+ print("passdbg_unary(): Node not unary!");
+ exitc(1);
+ }
+
+ INDENT_PRINT(0);
+ print("Unary Operator:\n");
+ indent_lvl += 2;
+ INDENT_PRINT(0);
+ print("Operator: %s\n", unary->operator.lexeme);
+ INDENT_PRINT(0);
+ print("Expr:\n");
+ indent_lvl += 2;
+ passdbg_walk(unary->expr);
+ indent_lvl -= 4;
+}
+
+void passdbg_binary(void *n)
+{
+ assert(n != NULL);
+
+ struct node_binary *binary = (struct node_binary*)n;
+
+ if (binary->ntype != N_BINARY) {
+ print("passdbg_binary(): error node not binary!");
+ exitc(1);
+ }
+
+ INDENT_PRINT(0);
+ print("Binary Operator:\n");
+ indent_lvl+=2;
+ INDENT_PRINT(0);
+ print("Operator: %s\n", binary->operator.lexeme);
+ INDENT_PRINT(0);
+ print("Left:\n");
+ indent_lvl+=2;
+ passdbg_walk(binary->left);
+ indent_lvl-=2;
+ INDENT_PRINT(0);
+ print("Right:\n");
+ indent_lvl+=2;
+ passdbg_walk(binary->right);
+ indent_lvl-=4;
+}
+
+#define __WALKER_CASE(type, func) case type: func; return
+
+void passdbg_walk(void *n)
+{
+ struct node* node = (struct node*)n;
+
+ switch (node->ntype) {
+ __WALKER_CASE(N_LITERAL, passdbg_primary(n));
+ __WALKER_CASE(N_UNARY, passdbg_unary(n));
+ __WALKER_CASE(N_BINARY, passdbg_binary(n));
+ default:
+ print("passdbg_walk(): invalid node type!\n");
+ exitc(1);
+ }
+}
+