refactor: moved NodeResult to TreeResult

This commit is contained in:
2026-05-13 12:19:17 -06:00
parent efa0e3bacd
commit 90c426f3a4
2 changed files with 20 additions and 12 deletions

View File

@@ -57,6 +57,14 @@ typedef struct {
ParserErr err; ParserErr err;
Node *node; Node *node;
}; };
} TreeResult;
typedef struct {
bool is_valid;
union {
ParserErr err;
Node node;
};
} NodeResult; } NodeResult;
typedef struct { typedef struct {
@@ -75,6 +83,6 @@ ParserU8Result infix_lbp(Node node);
ParserU8Result infix_rbp(Node node); ParserU8Result infix_rbp(Node node);
ParserResult parse(TokenizeResult tokens); ParserResult parse(TokenizeResult tokens);
NodeResult parse_expr(ArraySlice *slice, Arena *arena, uint8_t min_bp); TreeResult parse_expr(ArraySlice *slice, Arena *arena, uint8_t min_bp);
#endif // !PARSER_H #endif // !PARSER_H

View File

@@ -185,7 +185,7 @@ ParserResult parse(TokenizeResult tokens) {
ArraySlice *context = arraylist_slice(tokens.arr, 0, arraylist_size(tokens.arr)); ArraySlice *context = arraylist_slice(tokens.arr, 0, arraylist_size(tokens.arr));
Arena arena = arena_init(sizeof(Node) * arraylist_size(tokens.arr)).arena; Arena arena = arena_init(sizeof(Node) * arraylist_size(tokens.arr)).arena;
NodeResult result = parse_expr(context, &arena, 0); TreeResult result = parse_expr(context, &arena, 0);
if (!result.is_valid) { if (!result.is_valid) {
arena_destroy(&arena); arena_destroy(&arena);
arraylist_destroy(&tokens.arr); arraylist_destroy(&tokens.arr);
@@ -202,7 +202,7 @@ ParserResult parse(TokenizeResult tokens) {
.tree = result.node}; .tree = result.node};
} }
NodeResult parse_expr(ArraySlice *slice, Arena *arena, uint8_t min_bp) { TreeResult parse_expr(ArraySlice *slice, Arena *arena, uint8_t min_bp) {
arena_ensure_capacity( arena_ensure_capacity(
arena, arena,
sizeof(Node), sizeof(Node),
@@ -225,7 +225,7 @@ NodeResult parse_expr(ArraySlice *slice, Arena *arena, uint8_t min_bp) {
if (left_side->type == NODE_PARENTHESIS && if (left_side->type == NODE_PARENTHESIS &&
left_side->par == OP_START_PAR) { left_side->par == OP_START_PAR) {
NodeResult result = parse_expr(slice, arena, 0); TreeResult result = parse_expr(slice, arena, 0);
if (!result.is_valid) { if (!result.is_valid) {
return result; return result;
@@ -241,12 +241,12 @@ NodeResult parse_expr(ArraySlice *slice, Arena *arena, uint8_t min_bp) {
if (end_par.type != TOKEN_OPERATOR || if (end_par.type != TOKEN_OPERATOR ||
end_par.op != OP_END_PAR) { end_par.op != OP_END_PAR) {
return (NodeResult) { return (TreeResult) {
.is_valid = false, .is_valid = false,
.err = PARSER_UNMATCHED_PAREN, .err = PARSER_UNMATCHED_PAREN,
}; };
} }
return (NodeResult) { return (TreeResult) {
.is_valid = true, .is_valid = true,
.node = left_side, .node = left_side,
}; };
@@ -256,13 +256,13 @@ NodeResult parse_expr(ArraySlice *slice, Arena *arena, uint8_t min_bp) {
if (left_side->type == NODE_UNARY_OP) { if (left_side->type == NODE_UNARY_OP) {
ParserU8Result rbp_result = prefix_rbp(*left_side); ParserU8Result rbp_result = prefix_rbp(*left_side);
if (!rbp_result.is_valid) { if (!rbp_result.is_valid) {
return (NodeResult) { return (TreeResult) {
.is_valid = false, .is_valid = false,
.err = rbp_result.err, .err = rbp_result.err,
}; };
} }
NodeResult righ_side_result = parse_expr(slice, arena, rbp_result.num); TreeResult righ_side_result = parse_expr(slice, arena, rbp_result.num);
if (!righ_side_result.is_valid) { if (!righ_side_result.is_valid) {
return righ_side_result; return righ_side_result;
} }
@@ -278,7 +278,7 @@ NodeResult parse_expr(ArraySlice *slice, Arena *arena, uint8_t min_bp) {
Token operator_token; Token operator_token;
arrayslice_peek(slice, &operator_token); arrayslice_peek(slice, &operator_token);
if (operator_token.type != TOKEN_OPERATOR) { if (operator_token.type != TOKEN_OPERATOR) {
return (NodeResult) { return (TreeResult) {
.is_valid = false, .is_valid = false,
.err = PARSER_MISSING_OPERAND, .err = PARSER_MISSING_OPERAND,
}; };
@@ -317,7 +317,7 @@ NodeResult parse_expr(ArraySlice *slice, Arena *arena, uint8_t min_bp) {
ParserU8Result rbp_result = infix_rbp(operator_node); ParserU8Result rbp_result = infix_rbp(operator_node);
ParserU8Result lbp_result = infix_lbp(operator_node); ParserU8Result lbp_result = infix_lbp(operator_node);
if (!rbp_result.is_valid || !lbp_result.is_valid) { if (!rbp_result.is_valid || !lbp_result.is_valid) {
return (NodeResult) { return (TreeResult) {
.is_valid = false, .is_valid = false,
.err = PARSER_UNEXPECTED_TOKEN, .err = PARSER_UNEXPECTED_TOKEN,
}; };
@@ -335,7 +335,7 @@ NodeResult parse_expr(ArraySlice *slice, Arena *arena, uint8_t min_bp) {
// for the next one but taking our current // for the next one but taking our current
// concern that is rbp of the current operator // concern that is rbp of the current operator
arrayslice_next(slice, NULL); arrayslice_next(slice, NULL);
NodeResult right_side_result = parse_expr(slice, arena, rbp_result.num); TreeResult right_side_result = parse_expr(slice, arena, rbp_result.num);
if (!right_side_result.is_valid) { if (!right_side_result.is_valid) {
return right_side_result; return right_side_result;
} }
@@ -365,7 +365,7 @@ NodeResult parse_expr(ArraySlice *slice, Arena *arena, uint8_t min_bp) {
} }
// Final: return left side // Final: return left side
return (NodeResult){ return (TreeResult){
.is_valid = true, .is_valid = true,
.node = left_side, .node = left_side,
}; };