aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2022-03-30 14:44:31 +0200
committerBad Diode <bd@badd10de.dev>2022-03-30 14:44:31 +0200
commit138b466b897f94ea6a29a7b62c39caa717efafec (patch)
treef98ea86cc1ecb64548ef3cffae8c4bc4d69de53d /src
parent17ebf4051cca9b653ee7abedf2d07392f1393b34 (diff)
downloadbdl-138b466b897f94ea6a29a7b62c39caa717efafec.tar.gz
bdl-138b466b897f94ea6a29a7b62c39caa717efafec.zip
Use Node refs as return arguments from parsing
Diffstat (limited to 'src')
-rw-r--r--src/parser.c74
-rw-r--r--src/parser.h5
2 files changed, 49 insertions, 30 deletions
diff --git a/src/parser.c b/src/parser.c
index e784a0c..a82a97f 100644
--- a/src/parser.c
+++ b/src/parser.c
@@ -1,6 +1,15 @@
1#include "parser.h" 1#include "parser.h"
2#include "darray.h" 2#include "darray.h"
3 3
4Node *
5alloc_node(NodeType type) {
6 // TODO: Use a bump allocator?
7 // TODO: Free memory!
8 Node *node = malloc(sizeof(Node));
9 node->type = type;
10 return node;
11}
12
4Token 13Token
5next_token(Parser *parser) { 14next_token(Parser *parser) {
6 return parser->tokens[parser->current++]; 15 return parser->tokens[parser->current++];
@@ -16,7 +25,7 @@ has_next(Parser *parser) {
16 return parser->current < array_size(parser->tokens); 25 return parser->current < array_size(parser->tokens);
17} 26}
18 27
19Node 28Node *
20parse_number(Parser *parser) { 29parse_number(Parser *parser) {
21 Token tok = next_token(parser); 30 Token tok = next_token(parser);
22 31
@@ -40,7 +49,7 @@ parse_number(Parser *parser) {
40 c = sv_next(&tok.value); 49 c = sv_next(&tok.value);
41 } else if (!(c >= '0' && c <= '9')){ 50 } else if (!(c >= '0' && c <= '9')){
42 push_error(ERR_TYPE_PARSER, ERR_MALFORMED_NUMBER, tok.line, tok.col); 51 push_error(ERR_TYPE_PARSER, ERR_MALFORMED_NUMBER, tok.line, tok.col);
43 return (Node){.type = NODE_ERR}; 52 return NULL;
44 } 53 }
45 } 54 }
46 55
@@ -59,7 +68,7 @@ parse_number(Parser *parser) {
59 break; 68 break;
60 } else { 69 } else {
61 push_error(ERR_TYPE_PARSER, ERR_MALFORMED_NUMBER, tok.line, tok.col); 70 push_error(ERR_TYPE_PARSER, ERR_MALFORMED_NUMBER, tok.line, tok.col);
62 return (Node){.type = NODE_ERR}; 71 return NULL;
63 } 72 }
64 integral = integral * base + current; 73 integral = integral * base + current;
65 c = sv_next(&tok.value); 74 c = sv_next(&tok.value);
@@ -77,21 +86,33 @@ parse_number(Parser *parser) {
77 current = (c - '0'); 86 current = (c - '0');
78 } else { 87 } else {
79 push_error(ERR_TYPE_PARSER, ERR_MALFORMED_NUMBER, tok.line, tok.col); 88 push_error(ERR_TYPE_PARSER, ERR_MALFORMED_NUMBER, tok.line, tok.col);
80 return (Node){.type = NODE_ERR}; 89 return NULL;
81 } 90 }
82 fractional = fractional * base + current; 91 fractional = fractional * base + current;
83 c = sv_next(&tok.value); 92 c = sv_next(&tok.value);
84 } 93 }
85 94
86 return (Node){ 95 Node * node = alloc_node(NODE_NUMBER);
87 .type = NODE_NUMBER, 96 node->number.negative = negative;
88 .number.negative = negative, 97 node->number.integral = integral;
89 .number.integral = integral, 98 node->number.fractional = fractional;
90 .number.fractional = fractional, 99 return node;
91 };
92} 100}
93 101
94Node 102Node *
103parse_string(Parser *parser) {
104 Token tok = next_token(parser);
105 Node *node = alloc_node(NODE_STRING);
106 node->string = tok.value;
107 return node;
108}
109
110Node *
111parse_paren(Parser *parser) {
112 return NULL; // TODO: Not implemented
113}
114
115Node *
95parse_next(Parser *parser) { 116parse_next(Parser *parser) {
96 Token tok = peek_token(parser); 117 Token tok = peek_token(parser);
97 switch (tok.type) { 118 switch (tok.type) {
@@ -99,37 +120,36 @@ parse_next(Parser *parser) {
99 return parse_number(parser); 120 return parse_number(parser);
100 } break; 121 } break;
101 case TOKEN_STRING: { 122 case TOKEN_STRING: {
102 // TODO: return parse_string(parser); 123 return parse_string(parser);
103 next_token(parser);
104 return (Node){.type = NODE_STRING, .string = tok.value};
105 } break; 124 } break;
106 case TOKEN_LPAREN: { 125 case TOKEN_LPAREN: {
107 // TODO: return parse_paren(parser); 126 return parse_paren(parser);
108 push_error(ERR_TYPE_PARSER, ERR_UNIMPLEMENTED, tok.line, tok.col); 127 } break;
109 return (Node){.type = NODE_ERR}; 128 case TOKEN_EOF: {
129 return NULL;
110 } break; 130 } break;
111 default: { 131 default: {
112 push_error(ERR_TYPE_PARSER, ERR_UNKNOWN_TOK_TYPE, tok.line, tok.col); 132 push_error(ERR_TYPE_PARSER, ERR_UNKNOWN_TOK_TYPE, tok.line, tok.col);
113 return (Node){.type = NODE_ERR}; 133 return NULL;
114 } break; 134 } break;
115 } 135 }
116} 136}
117 137
118void 138void
119print_node(Node node) { 139print_node(Node *node) {
120 switch (node.type) { 140 switch (node->type) {
121 case NODE_NUMBER: { 141 case NODE_NUMBER: {
122 if (node.number.negative) { 142 if (node->number.negative) {
123 printf("-"); 143 printf("-");
124 } 144 }
125 if (node.number.fractional != 0) { 145 if (node->number.fractional != 0) {
126 printf("%zu.%zu\n", node.number.integral, node.number.fractional); 146 printf("%zu.%zu\n", node->number.integral, node->number.fractional);
127 } else { 147 } else {
128 printf("%zu\n", node.number.integral); 148 printf("%zu\n", node->number.integral);
129 } 149 }
130 } break; 150 } break;
131 case NODE_STRING: { 151 case NODE_STRING: {
132 sv_write(&node.string); 152 sv_write(&node->string);
133 printf("\n"); 153 printf("\n");
134 } break; 154 } break;
135 default: { printf("{#unk}"); } break; 155 default: { printf("{#unk}"); } break;
@@ -149,8 +169,8 @@ parse(Token *tokens) {
149 } 169 }
150 170
151 while (has_next(&parser)) { 171 while (has_next(&parser)) {
152 Node node = parse_next(&parser); 172 Node *node = parse_next(&parser);
153 if (node.type == NODE_ERR) { 173 if (node == NULL) {
154 return; 174 return;
155 } 175 }
156 print_node(node); 176 print_node(node);
diff --git a/src/parser.h b/src/parser.h
index 21a2711..5a9d5c8 100644
--- a/src/parser.h
+++ b/src/parser.h
@@ -9,7 +9,6 @@ typedef struct Parser {
9} Parser; 9} Parser;
10 10
11typedef enum NodeType { 11typedef enum NodeType {
12 NODE_ERR,
13 // NODE_FUNCALL, 12 // NODE_FUNCALL,
14 // NODE_U64, 13 // NODE_U64,
15 // NODE_U32, 14 // NODE_U32,
@@ -30,8 +29,8 @@ typedef struct Node {
30 // Numbers. 29 // Numbers.
31 struct { 30 struct {
32 bool negative; 31 bool negative;
33 u64 integral; 32 size_t integral;
34 u64 fractional; 33 size_t fractional;
35 } number; 34 } number;
36 35
37 // String. 36 // String.