refactor-error-handling #12
@@ -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);
|
||||||
|
|||||||
42
src/parser.c
42
src/parser.c
@@ -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, ¤t_token) != ARRLIST_OK) {
|
if (arrayslice_next(slice, ¤t_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;
|
||||||
|
|||||||
Reference in New Issue
Block a user