WOW, finally making some sense, i think i get it, finally got the skelleton, gonna keep reading for adding more interesting things and doing things right, for now i think i got the parse_expr
This commit is contained in:
@@ -1,4 +1,5 @@
|
|||||||
#include "lexer.h"
|
#include "lexer.h"
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
ASTNode *head;
|
ASTNode *head;
|
||||||
@@ -9,13 +10,13 @@ typedef struct {
|
|||||||
size_t pos;
|
size_t pos;
|
||||||
} ASTNodeSlice;
|
} ASTNodeSlice;
|
||||||
|
|
||||||
ASTNode ASTNodeSlice_peek(ASTNodeSlice slice);
|
ASTNode ASTNodeSlice_peek(ASTNodeSlice *slice);
|
||||||
ASTNode ASTNodeSlice_next(ASTNodeSlice slice);
|
ASTNode ASTNodeSlice_next(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);
|
||||||
|
|
||||||
size_t node_lbp(ASTNode node);
|
uint8_t node_lbp(ASTNode node);
|
||||||
size_t node_rbp(ASTNode node);
|
uint8_t node_rbp(ASTNode node);
|
||||||
AST parse(ASTNodeArray arr);
|
AST parse(ASTNodeArray arr);
|
||||||
AST parse_expr(ASTNodeSlice *arr);
|
ASTNode *parse_expr(ASTNodeSlice *slice, uint8_t min_bp);
|
||||||
|
|||||||
42
src/parser.c
42
src/parser.c
@@ -1,8 +1,9 @@
|
|||||||
#include "parser.h"
|
#include "parser.h"
|
||||||
#include "lexer.h"
|
#include "lexer.h"
|
||||||
|
#include <stdint.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
size_t node_lbp(ASTNode node) {
|
uint8_t node_lbp(ASTNode node) {
|
||||||
if (node.type == NODE_INTEGER) {
|
if (node.type == NODE_INTEGER) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -14,13 +15,13 @@ size_t node_lbp(ASTNode node) {
|
|||||||
break;
|
break;
|
||||||
case OP_DIV:
|
case OP_DIV:
|
||||||
case OP_MUL:
|
case OP_MUL:
|
||||||
return 20;
|
return 30;
|
||||||
default:
|
default:
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t node_rbp(ASTNode node) {
|
uint8_t node_rbp(ASTNode node) {
|
||||||
if (node.type == NODE_INTEGER) {
|
if (node.type == NODE_INTEGER) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -28,12 +29,43 @@ size_t node_rbp(ASTNode node) {
|
|||||||
switch (node.data.binary.op) {
|
switch (node.data.binary.op) {
|
||||||
case OP_ADD:
|
case OP_ADD:
|
||||||
case OP_SUB:
|
case OP_SUB:
|
||||||
return 10;
|
return 20;
|
||||||
break;
|
break;
|
||||||
case OP_DIV:
|
case OP_DIV:
|
||||||
case OP_MUL:
|
case OP_MUL:
|
||||||
return 20;
|
return 40;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
ASTNode operator = operator = ASTNodeSlice_peek(slice);
|
||||||
|
uint8_t rbp = node_rbp(operator);
|
||||||
|
uint8_t lbp = node_lbp(operator);
|
||||||
|
|
||||||
|
if (lbp < min_bp) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
ASTNodeSlice_next(slice);
|
||||||
|
ASTNode *right_side = parse_expr(slice, rbp);
|
||||||
|
|
||||||
|
ASTNode *new_node = malloc(sizeof(ASTNode));
|
||||||
|
*new_node = operator;
|
||||||
|
|
||||||
|
new_node->data.binary.left = left_side;
|
||||||
|
new_node->data.binary.right = right_side;
|
||||||
|
|
||||||
|
left_side = new_node;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return left_side;
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user