diff options
author | Bad Diode <bd@badd10de.dev> | 2022-03-30 14:44:31 +0200 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2022-03-30 14:44:31 +0200 |
commit | 138b466b897f94ea6a29a7b62c39caa717efafec (patch) | |
tree | f98ea86cc1ecb64548ef3cffae8c4bc4d69de53d /src/parser.c | |
parent | 17ebf4051cca9b653ee7abedf2d07392f1393b34 (diff) | |
download | bdl-138b466b897f94ea6a29a7b62c39caa717efafec.tar.gz bdl-138b466b897f94ea6a29a7b62c39caa717efafec.zip |
Use Node refs as return arguments from parsing
Diffstat (limited to 'src/parser.c')
-rw-r--r-- | src/parser.c | 74 |
1 files changed, 47 insertions, 27 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 | ||
4 | Node * | ||
5 | alloc_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 | |||
4 | Token | 13 | Token |
5 | next_token(Parser *parser) { | 14 | next_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 | ||
19 | Node | 28 | Node * |
20 | parse_number(Parser *parser) { | 29 | parse_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 | ||
94 | Node | 102 | Node * |
103 | parse_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 | |||
110 | Node * | ||
111 | parse_paren(Parser *parser) { | ||
112 | return NULL; // TODO: Not implemented | ||
113 | } | ||
114 | |||
115 | Node * | ||
95 | parse_next(Parser *parser) { | 116 | parse_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 | ||
118 | void | 138 | void |
119 | print_node(Node node) { | 139 | print_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); |