FUCK YEAH, it works, it was the is_valid thing fo slices that was inverted, did the test by brute force and damn, is the expected AST
This commit is contained in:
@@ -23,5 +23,3 @@ 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);
|
||||||
|
|
||||||
void print_AST(AST tree);
|
|
||||||
void print_node(ASTNode *node, int depth);
|
|
||||||
|
|||||||
@@ -9,7 +9,6 @@ int main(void) {
|
|||||||
tokenize("3 + 4 * 5", &context);
|
tokenize("3 + 4 * 5", &context);
|
||||||
|
|
||||||
AST tree = parse(&context);
|
AST tree = parse(&context);
|
||||||
print_AST(tree);
|
|
||||||
|
|
||||||
printf("Hola\n");
|
printf("Hola\n");
|
||||||
|
|
||||||
|
|||||||
32
src/parser.c
32
src/parser.c
@@ -74,7 +74,7 @@ ASTNode *parse_expr(ASTNodeSlice *slice, uint8_t min_bp) {
|
|||||||
*left_side = ASTNodeSlice_next(slice);
|
*left_side = ASTNodeSlice_next(slice);
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
if (ASTNodeSlice_is_valid(slice)) {
|
if (!ASTNodeSlice_is_valid(slice)) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -102,35 +102,5 @@ ASTNode *parse_expr(ASTNodeSlice *slice, uint8_t min_bp) {
|
|||||||
return left_side;
|
return left_side;
|
||||||
}
|
}
|
||||||
|
|
||||||
void print_AST(AST tree) {
|
|
||||||
print_node(tree.head, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
void print_node(ASTNode *node, int depth) {
|
|
||||||
if (node == NULL) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (node->type == NODE_BINARY_OP) {
|
|
||||||
print_node(node->data.binary.right, depth + 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 0; i < depth; i++) {
|
|
||||||
printf(" ");
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (node->type) {
|
|
||||||
case NODE_INTEGER:
|
|
||||||
printf("%ld\n", node->data.integer);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case NODE_BINARY_OP:
|
|
||||||
printf("%c\n", operator_to_char(node->data.binary.op));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (node->type == NODE_BINARY_OP) {
|
|
||||||
print_node(node->data.binary.left, depth + 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|||||||
@@ -46,7 +46,56 @@ static void test_parsing_basic_expression(void **state) {
|
|||||||
assert_int_equal(node.data.integer, 789);
|
assert_int_equal(node.data.integer, 789);
|
||||||
|
|
||||||
AST tree = parse(&tokens);
|
AST tree = parse(&tokens);
|
||||||
|
// Assert head is +
|
||||||
assert_int_equal(tree.head->type, NODE_BINARY_OP);
|
assert_int_equal(tree.head->type, NODE_BINARY_OP);
|
||||||
|
assert_int_equal(tree.head->data.binary.op, OP_ADD);
|
||||||
|
|
||||||
|
assert_int_equal(tree.head->data.binary.left->type, NODE_INTEGER);
|
||||||
|
assert_int_equal(tree.head->data.binary.left->data.integer, 2);
|
||||||
|
|
||||||
|
|
||||||
|
assert_int_equal(
|
||||||
|
tree.head->data.binary.right->type,
|
||||||
|
NODE_BINARY_OP
|
||||||
|
);
|
||||||
|
assert_int_equal(
|
||||||
|
tree.head->data.binary.right->data.binary.op,
|
||||||
|
OP_MUL
|
||||||
|
);
|
||||||
|
|
||||||
|
assert_int_equal(
|
||||||
|
tree.head->data.binary.right->data.binary.right->type,
|
||||||
|
NODE_INTEGER);
|
||||||
|
assert_int_equal(
|
||||||
|
tree.head->data.binary.right->data.binary.right->data.integer,
|
||||||
|
789);
|
||||||
|
|
||||||
|
assert_int_equal(
|
||||||
|
tree.head->data.binary.right->data.binary.left->type,
|
||||||
|
NODE_BINARY_OP
|
||||||
|
);
|
||||||
|
assert_int_equal(
|
||||||
|
tree.head->data.binary.right->data.binary.left->data.binary.op,
|
||||||
|
OP_DIV
|
||||||
|
);
|
||||||
|
|
||||||
|
assert_int_equal(
|
||||||
|
tree.head->data.binary.right->data.binary.left->data.binary.right->type,
|
||||||
|
NODE_INTEGER
|
||||||
|
);
|
||||||
|
assert_int_equal(
|
||||||
|
tree.head->data.binary.right->data.binary.left->data.binary.right->data.integer,
|
||||||
|
66
|
||||||
|
);
|
||||||
|
|
||||||
|
assert_int_equal(
|
||||||
|
tree.head->data.binary.right->data.binary.left->data.binary.left->type,
|
||||||
|
NODE_INTEGER
|
||||||
|
);
|
||||||
|
assert_int_equal(
|
||||||
|
tree.head->data.binary.right->data.binary.left->data.binary.left->data.integer,
|
||||||
|
3
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(void) {
|
int main(void) {
|
||||||
|
|||||||
Reference in New Issue
Block a user