From 7d28b697905d15b425ed6c277ee4401dbca25dcb Mon Sep 17 00:00:00 2001 From: LaEntropiaa Date: Tue, 24 Mar 2026 21:44:08 -0600 Subject: [PATCH] added parse, just need a few more helper funtions to start testing some things --- include/parser.h | 3 ++- src/parser.c | 15 ++++++++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/include/parser.h b/include/parser.h index 80c452a..5a6ca6b 100644 --- a/include/parser.h +++ b/include/parser.h @@ -12,11 +12,12 @@ typedef struct { ASTNode ASTNodeSlice_peek(ASTNodeSlice *slice); ASTNode ASTNodeSlice_next(ASTNodeSlice *slice); +bool ASTNodeSlice_is_valid(ASTNodeSlice *slice); ASTNode *nud(ASTNodeSlice *slice); ASTNode *led(ASTNodeSlice *slice, size_t right_precedence); uint8_t node_lbp(ASTNode node); uint8_t node_rbp(ASTNode node); -AST parse(ASTNodeArray arr); +AST parse(ASTNodeArray *arr); ASTNode *parse_expr(ASTNodeSlice *slice, uint8_t min_bp); diff --git a/src/parser.c b/src/parser.c index 71e8cb4..8d9f365 100644 --- a/src/parser.c +++ b/src/parser.c @@ -37,12 +37,25 @@ uint8_t node_rbp(ASTNode node) { } } + + +AST parse(ASTNodeArray *arr) { + AST tree; + ASTNodeSlice context = { + .arr = arr, + .pos = 0, + }; + + tree.head = parse_expr(&context, 0); + return tree; +} + 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) { + if (ASTNodeSlice_is_valid(slice)) { break; }