refactor: bp funtions take tokens now

necessary for cleannes
This commit is contained in:
2026-05-13 17:48:03 -06:00
parent 6294121e91
commit b56a368244
2 changed files with 23 additions and 30 deletions

View File

@@ -38,7 +38,7 @@ typedef enum {
PARSER_UNMATCHED_PAREN, PARSER_UNMATCHED_PAREN,
PARSER_OUT_OF_MEMORY, PARSER_OUT_OF_MEMORY,
PARSER_INVALID_TOKENIZE, PARSER_INVALID_TOKENIZE,
PARSER_UNEXMECTED_EOF, PARSER_UNEXPECTED_EOF,
} ParserErr; } ParserErr;
typedef struct { typedef struct {
@@ -76,14 +76,13 @@ typedef struct {
}; };
} ParserU8Result; } ParserU8Result;
Node token_to_node(Token token);
TreeResult nud(ArraySlice *slice, Arena *arena, Token token); // Null denotation TreeResult nud(ArraySlice *slice, Arena *arena, Token token); // Null denotation
TreeResult led(ArraySlice *slice, Arena *arena, Node *left, Token token); // Left denotation TreeResult led(ArraySlice *slice, Arena *arena, Node *left, Token token); // Left denotation
ParserU8Result prefix_rbp(Node node); ParserU8Result prefix_rbp(Token token);
ParserU8Result postfix_lbp(Node node); ParserU8Result postfix_lbp(Token token);
ParserU8Result infix_lbp(Node node); ParserU8Result infix_lbp(Token token);
ParserU8Result infix_rbp(Node node); ParserU8Result infix_rbp(Token token);
ParserResult parse(TokenizeResult tokens); ParserResult parse(TokenizeResult tokens);
TreeResult parse_expr(ArraySlice *slice, Arena *arena, uint8_t min_bp); TreeResult parse_expr(ArraySlice *slice, Arena *arena, uint8_t min_bp);

View File

@@ -7,15 +7,14 @@
#include <stdbool.h> #include <stdbool.h>
#include <stdint.h> #include <stdint.h>
ParserU8Result prefix_rbp(Node node) { ParserU8Result prefix_rbp(Token token) {
if (node.type != NODE_UNARY_OP) { if (token.type == TOKEN_INTEGER) {
return (ParserU8Result) { return (ParserU8Result) {
.is_valid = false, .is_valid = false,
.err = PARSER_UNEXPECTED_TOKEN .err = PARSER_UNEXPECTED_TOKEN,
}; };
} }
switch (token.op) {
switch (node.unary.op) {
case OP_SUB: case OP_SUB:
case OP_ADD: case OP_ADD:
return (ParserU8Result) { return (ParserU8Result) {
@@ -30,15 +29,15 @@ ParserU8Result prefix_rbp(Node node) {
} }
} }
ParserU8Result postfix_lbp(Node node) { ParserU8Result postfix_lbp(Token token) {
if (node.type != NODE_UNARY_OP) { if (token.type != TOKEN_INTEGER) {
return (ParserU8Result) { return (ParserU8Result) {
.is_valid = false, .is_valid = false,
.err = PARSER_UNEXPECTED_TOKEN, .err = PARSER_UNEXPECTED_TOKEN,
}; };
} }
switch (node.unary.op) { switch (token.op) {
case OP_FACTORIAL: case OP_FACTORIAL:
return (ParserU8Result) { return (ParserU8Result) {
.is_valid = true, .is_valid = true,
@@ -52,15 +51,15 @@ ParserU8Result postfix_lbp(Node node) {
} }
} }
ParserU8Result infix_lbp(Node node) { ParserU8Result infix_lbp(Token token) {
if (node.type != NODE_BINARY_OP) { if (token.type != TOKEN_INTEGER) {
return (ParserU8Result) { return (ParserU8Result) {
.is_valid = false, .is_valid = false,
.err = PARSER_UNEXPECTED_TOKEN, .err = PARSER_UNEXPECTED_TOKEN,
}; };
} }
switch (node.binary.op) { switch (token.op) {
case OP_ADD: case OP_ADD:
case OP_SUB: case OP_SUB:
return (ParserU8Result) { return (ParserU8Result) {
@@ -86,15 +85,15 @@ ParserU8Result infix_lbp(Node node) {
} }
} }
ParserU8Result infix_rbp(Node node) { ParserU8Result infix_rbp(Token token) {
if (node.type != NODE_BINARY_OP) { if (token.type != TOKEN_INTEGER) {
return (ParserU8Result) { return (ParserU8Result) {
.is_valid = false, .is_valid = false,
.err = PARSER_UNEXPECTED_TOKEN, .err = PARSER_UNEXPECTED_TOKEN,
}; };
} }
switch (node.binary.op) { switch (token.op) {
case OP_ADD: case OP_ADD:
case OP_SUB: case OP_SUB:
return (ParserU8Result) { return (ParserU8Result) {
@@ -151,7 +150,7 @@ TreeResult led(
node->type = NODE_BINARY_OP; node->type = NODE_BINARY_OP;
node->binary.op = token.op; node->binary.op = token.op;
ParserU8Result rbp_result = infix_rbp(*node); ParserU8Result rbp_result = infix_rbp(token);
if (!rbp_result.is_valid) { if (!rbp_result.is_valid) {
return (TreeResult) { return (TreeResult) {
.is_valid = false, .is_valid = false,
@@ -254,7 +253,7 @@ TreeResult nud(ArraySlice *slice, Arena *arena, Token token) {
node->type = NODE_UNARY_OP; node->type = NODE_UNARY_OP;
node->unary.op = token.op; node->unary.op = token.op;
ParserU8Result rbp_result = prefix_rbp(*node); ParserU8Result rbp_result = prefix_rbp(token);
if (!rbp_result.is_valid) { if (!rbp_result.is_valid) {
return (TreeResult) { return (TreeResult) {
.is_valid = false, .is_valid = false,
@@ -323,7 +322,7 @@ TreeResult parse_expr(ArraySlice *slice, Arena *arena, uint8_t min_bp) {
if (arrayslice_next(slice, &current_token) != ARRLIST_OK) { if (arrayslice_next(slice, &current_token) != ARRLIST_OK) {
return (TreeResult) { return (TreeResult) {
.is_valid = false, .is_valid = false,
.err = PARSER_UNEXMECTED_EOF, .err = PARSER_UNEXPECTED_EOF,
}; };
} }
@@ -343,12 +342,7 @@ TreeResult parse_expr(ArraySlice *slice, Arena *arena, uint8_t min_bp) {
break; break;
} }
Node operator_node = { ParserU8Result postfix_lbp_result = postfix_lbp(operator_token);
.type = NODE_BINARY_OP,
.binary.op = operator_token.op,
};
ParserU8Result postfix_lbp_result = postfix_lbp(operator_node);
if (postfix_lbp_result.is_valid) { if (postfix_lbp_result.is_valid) {
if (postfix_lbp_result.num < min_bp) { if (postfix_lbp_result.num < min_bp) {
@@ -369,7 +363,7 @@ TreeResult parse_expr(ArraySlice *slice, Arena *arena, uint8_t min_bp) {
} }
// Path for infix basically // Path for infix basically
ParserU8Result lbp_result = infix_lbp(operator_node); ParserU8Result lbp_result = infix_lbp(operator_token);
if (!lbp_result.is_valid) { if (!lbp_result.is_valid) {
break; break;