added parse, just need a few more helper funtions to start testing some things
This commit is contained in:
@@ -12,11 +12,12 @@ typedef struct {
|
||||
|
||||
ASTNode ASTNodeSlice_peek(ASTNodeSlice *slice);
|
||||
ASTNode ASTNodeSlice_next(ASTNodeSlice *slice);
|
||||
bool ASTNodeSlice_is_valid(ASTNodeSlice *slice);
|
||||
|
||||
ASTNode *nud(ASTNodeSlice *slice);
|
||||
ASTNode *led(ASTNodeSlice *slice, size_t right_precedence);
|
||||
|
||||
uint8_t node_lbp(ASTNode node);
|
||||
uint8_t node_rbp(ASTNode node);
|
||||
AST parse(ASTNodeArray arr);
|
||||
AST parse(ASTNodeArray *arr);
|
||||
ASTNode *parse_expr(ASTNodeSlice *slice, uint8_t min_bp);
|
||||
|
||||
15
src/parser.c
15
src/parser.c
@@ -37,12 +37,25 @@ uint8_t node_rbp(ASTNode node) {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
AST parse(ASTNodeArray *arr) {
|
||||
AST tree;
|
||||
ASTNodeSlice context = {
|
||||
.arr = arr,
|
||||
.pos = 0,
|
||||
};
|
||||
|
||||
tree.head = parse_expr(&context, 0);
|
||||
return tree;
|
||||
}
|
||||
|
||||
ASTNode *parse_expr(ASTNodeSlice *slice, uint8_t min_bp) {
|
||||
ASTNode *left_side = malloc(sizeof(ASTNode));
|
||||
*left_side = ASTNodeSlice_next(slice);
|
||||
|
||||
while (true) {
|
||||
if (slice->pos >= slice->arr->len - 1) {
|
||||
if (ASTNodeSlice_is_valid(slice)) {
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user