From 0d883ae9786bfb3a10a85539ec7ca234c0a2d72c Mon Sep 17 00:00:00 2001 From: LaEntropiaa Date: Tue, 24 Mar 2026 21:36:14 -0600 Subject: [PATCH] WOW, finally making some sense, i think i get it, finally got the skelleton, gonna keep reading for adding more interesting things and doing things right, for now i think i got the parse_expr --- include/parser.h | 11 ++++++----- src/parser.c | 42 +++++++++++++++++++++++++++++++++++++----- 2 files changed, 43 insertions(+), 10 deletions(-) diff --git a/include/parser.h b/include/parser.h index abb4061..80c452a 100644 --- a/include/parser.h +++ b/include/parser.h @@ -1,4 +1,5 @@ #include "lexer.h" +#include typedef struct { ASTNode *head; @@ -9,13 +10,13 @@ typedef struct { size_t pos; } ASTNodeSlice; -ASTNode ASTNodeSlice_peek(ASTNodeSlice slice); -ASTNode ASTNodeSlice_next(ASTNodeSlice slice); +ASTNode ASTNodeSlice_peek(ASTNodeSlice *slice); +ASTNode ASTNodeSlice_next(ASTNodeSlice *slice); ASTNode *nud(ASTNodeSlice *slice); ASTNode *led(ASTNodeSlice *slice, size_t right_precedence); -size_t node_lbp(ASTNode node); -size_t node_rbp(ASTNode node); +uint8_t node_lbp(ASTNode node); +uint8_t node_rbp(ASTNode node); AST parse(ASTNodeArray arr); -AST parse_expr(ASTNodeSlice *arr); +ASTNode *parse_expr(ASTNodeSlice *slice, uint8_t min_bp); diff --git a/src/parser.c b/src/parser.c index 788e7de..71e8cb4 100644 --- a/src/parser.c +++ b/src/parser.c @@ -1,8 +1,9 @@ #include "parser.h" #include "lexer.h" +#include #include -size_t node_lbp(ASTNode node) { +uint8_t node_lbp(ASTNode node) { if (node.type == NODE_INTEGER) { return 0; } @@ -14,13 +15,13 @@ size_t node_lbp(ASTNode node) { break; case OP_DIV: case OP_MUL: - return 20; + return 30; default: return 0; } } -size_t node_rbp(ASTNode node) { +uint8_t node_rbp(ASTNode node) { if (node.type == NODE_INTEGER) { return 0; } @@ -28,12 +29,43 @@ size_t node_rbp(ASTNode node) { switch (node.data.binary.op) { case OP_ADD: case OP_SUB: - return 10; + return 20; break; case OP_DIV: case OP_MUL: - return 20; + return 40; } } +ASTNode *parse_expr(ASTNodeSlice *slice, uint8_t min_bp) { + ASTNode *left_side = malloc(sizeof(ASTNode)); + *left_side = ASTNodeSlice_next(slice); + while (true) { + if (slice->pos >= slice->arr->len - 1) { + break; + } + + ASTNode operator = operator = ASTNodeSlice_peek(slice); + uint8_t rbp = node_rbp(operator); + uint8_t lbp = node_lbp(operator); + + if (lbp < min_bp) { + break; + } + + ASTNodeSlice_next(slice); + ASTNode *right_side = parse_expr(slice, rbp); + + ASTNode *new_node = malloc(sizeof(ASTNode)); + *new_node = operator; + + new_node->data.binary.left = left_side; + new_node->data.binary.right = right_side; + + left_side = new_node; + } + + + return left_side; +}