diff --git a/include/parser.h b/include/parser.h index b8f80f9..abb4061 100644 --- a/include/parser.h +++ b/include/parser.h @@ -9,9 +9,13 @@ typedef struct { size_t pos; } ASTNodeSlice; -ASTNode *nud(ASTNodeSlice *slice, size_t pos); -ASTNode *led(ASTNodeSlice *slice, size_t pos, size_t right_precedence); +ASTNode ASTNodeSlice_peek(ASTNodeSlice slice); +ASTNode ASTNodeSlice_next(ASTNodeSlice slice); + +ASTNode *nud(ASTNodeSlice *slice); +ASTNode *led(ASTNodeSlice *slice, size_t right_precedence); size_t node_lbp(ASTNode node); size_t node_rbp(ASTNode node); AST parse(ASTNodeArray arr); +AST parse_expr(ASTNodeSlice *arr); diff --git a/src/parser.c b/src/parser.c index 238cd0a..788e7de 100644 --- a/src/parser.c +++ b/src/parser.c @@ -2,8 +2,30 @@ #include "lexer.h" #include -size_t node_lbp(Operator op) { - switch (op) { +size_t node_lbp(ASTNode node) { + if (node.type == NODE_INTEGER) { + return 0; + } + + switch (node.data.binary.op) { + case OP_ADD: + case OP_SUB: + return 10; + break; + case OP_DIV: + case OP_MUL: + return 20; + default: + return 0; + } +} + +size_t node_rbp(ASTNode node) { + if (node.type == NODE_INTEGER) { + return 0; + } + + switch (node.data.binary.op) { case OP_ADD: case OP_SUB: return 10; @@ -14,14 +36,4 @@ size_t node_lbp(Operator op) { } } -size_t node_rbp(Operator op) { - switch (op) { - case OP_ADD: - case OP_SUB: - return 10; - break; - case OP_DIV: - case OP_MUL: - return 20; - } -} +