refactor: moved NodeResult to TreeResult
This commit is contained in:
@@ -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
|
||||||
|
|||||||
22
src/parser.c
22
src/parser.c
@@ -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,
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user