aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2022-04-06 08:34:40 -0300
committerBad Diode <bd@badd10de.dev>2022-04-06 08:34:40 -0300
commit725ba80c048069d15b2668ad0fa0e123819ec410 (patch)
tree79469056bfda94ef9f6a960457c98f03129d8b64 /src
parenta2274155bce516f904486e7f0ddf20d01093251b (diff)
downloadbdl-725ba80c048069d15b2668ad0fa0e123819ec410.tar.gz
bdl-725ba80c048069d15b2668ad0fa0e123819ec410.zip
Prepare parse tree for return
Diffstat (limited to 'src')
-rw-r--r--src/parser.c24
-rw-r--r--src/parser.h9
2 files changed, 25 insertions, 8 deletions
diff --git a/src/parser.c b/src/parser.c
index 2c1c24f..ba063f1 100644
--- a/src/parser.c
+++ b/src/parser.c
@@ -3,17 +3,17 @@
3 3
4Token 4Token
5next_token(Parser *parser) { 5next_token(Parser *parser) {
6 return parser->tokens[parser->current++]; 6 return parser->tokens[parser->current_token++];
7} 7}
8 8
9Token 9Token
10peek_token(Parser *parser) { 10peek_token(Parser *parser) {
11 return parser->tokens[parser->current]; 11 return parser->tokens[parser->current_token];
12} 12}
13 13
14bool 14bool
15has_next(Parser *parser) { 15has_next(Parser *parser) {
16 return parser->current < array_size(parser->tokens); 16 return parser->current_token < array_size(parser->tokens);
17} 17}
18 18
19bool 19bool
@@ -408,12 +408,20 @@ parse_next(Parser *parser) {
408 } 408 }
409} 409}
410 410
411void 411ParseTree *
412alloc_parsetree(void) {
413 ParseTree *parse_tree = malloc(sizeof(ParseTree));
414 array_init(parse_tree->roots, 0);
415 return parse_tree;
416}
417
418ParseTree *
412parse(Token *tokens) { 419parse(Token *tokens) {
413 Parser parser = { 420 Parser parser = {
414 .tokens = tokens, 421 .tokens = tokens,
415 .current = 0, 422 .current_token = 0,
416 }; 423 };
424 parser.parse_tree = alloc_parsetree();
417 425
418 // DEBUG: TOKENS 426 // DEBUG: TOKENS
419 printf("-- tokens --\n"); 427 printf("-- tokens --\n");
@@ -423,9 +431,13 @@ parse(Token *tokens) {
423 while (has_next(&parser)) { 431 while (has_next(&parser)) {
424 Node *node = parse_next(&parser); 432 Node *node = parse_next(&parser);
425 if (node == NULL) { 433 if (node == NULL) {
426 return; 434 return NULL;
427 } 435 }
436 // DEBUG:...
428 print_node(node); 437 print_node(node);
429 printf("\n"); 438 printf("\n");
439
440 array_push(parser.parse_tree->roots, node);
430 } 441 }
442 return parser.parse_tree;
431} 443}
diff --git a/src/parser.h b/src/parser.h
index 47316b9..4d871ad 100644
--- a/src/parser.h
+++ b/src/parser.h
@@ -4,12 +4,17 @@
4#include "lexer.h" 4#include "lexer.h"
5#include "nodes.h" 5#include "nodes.h"
6 6
7typedef struct ParseTree {
8 Node **roots;
9} ParseTree;
10
7typedef struct Parser { 11typedef struct Parser {
8 Token *tokens; 12 Token *tokens;
9 size_t current; 13 size_t current_token;
14 ParseTree *parse_tree;
10} Parser; 15} Parser;
11 16
12void parse(Token *tokens); 17ParseTree * parse(Token *tokens);
13Node * parse_next(Parser *parser); 18Node * parse_next(Parser *parser);
14 19
15#endif // BDL_PARSER_H 20#endif // BDL_PARSER_H