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_peek(ASTNodeSlice *slice);
|
||||||
ASTNode ASTNodeSlice_next(ASTNodeSlice *slice);
|
ASTNode ASTNodeSlice_next(ASTNodeSlice *slice);
|
||||||
|
bool ASTNodeSlice_is_valid(ASTNodeSlice *slice);
|
||||||
|
|
||||||
ASTNode *nud(ASTNodeSlice *slice);
|
ASTNode *nud(ASTNodeSlice *slice);
|
||||||
ASTNode *led(ASTNodeSlice *slice, size_t right_precedence);
|
ASTNode *led(ASTNodeSlice *slice, size_t right_precedence);
|
||||||
|
|
||||||
uint8_t node_lbp(ASTNode node);
|
uint8_t node_lbp(ASTNode node);
|
||||||
uint8_t node_rbp(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);
|
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 *parse_expr(ASTNodeSlice *slice, uint8_t min_bp) {
|
||||||
ASTNode *left_side = malloc(sizeof(ASTNode));
|
ASTNode *left_side = malloc(sizeof(ASTNode));
|
||||||
*left_side = ASTNodeSlice_next(slice);
|
*left_side = ASTNodeSlice_next(slice);
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
if (slice->pos >= slice->arr->len - 1) {
|
if (ASTNodeSlice_is_valid(slice)) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user