added parse, just need a few more helper funtions to start testing some things

This commit is contained in:
2026-03-24 21:44:08 -06:00
parent 0d883ae978
commit 7d28b69790
2 changed files with 16 additions and 2 deletions

View File

@@ -12,11 +12,12 @@ typedef struct {
ASTNode ASTNodeSlice_peek(ASTNodeSlice *slice); ASTNode ASTNodeSlice_peek(ASTNodeSlice *slice);
ASTNode ASTNodeSlice_next(ASTNodeSlice *slice); ASTNode ASTNodeSlice_next(ASTNodeSlice *slice);
bool ASTNodeSlice_is_valid(ASTNodeSlice *slice);
ASTNode *nud(ASTNodeSlice *slice); ASTNode *nud(ASTNodeSlice *slice);
ASTNode *led(ASTNodeSlice *slice, size_t right_precedence); ASTNode *led(ASTNodeSlice *slice, size_t right_precedence);
uint8_t node_lbp(ASTNode node); uint8_t node_lbp(ASTNode node);
uint8_t node_rbp(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); ASTNode *parse_expr(ASTNodeSlice *slice, uint8_t min_bp);

View File

@@ -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 *parse_expr(ASTNodeSlice *slice, uint8_t min_bp) {
ASTNode *left_side = malloc(sizeof(ASTNode)); ASTNode *left_side = malloc(sizeof(ASTNode));
*left_side = ASTNodeSlice_next(slice); *left_side = ASTNodeSlice_next(slice);
while (true) { while (true) {
if (slice->pos >= slice->arr->len - 1) { if (ASTNodeSlice_is_valid(slice)) {
break; break;
} }