diff options
author | Bad Diode <bd@badd10de.dev> | 2024-06-16 22:25:37 +0200 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2024-06-16 22:25:37 +0200 |
commit | 357f02dc5f1f2ad99210faf13c2b1fd7dff6e669 (patch) | |
tree | e0f1616ca87597b8dc710e6dc00fe7ac6479d68f /src | |
parent | 3922b262aef17be3fcee90db969aca5b0edc617e (diff) | |
download | bdl-357f02dc5f1f2ad99210faf13c2b1fd7dff6e669.tar.gz bdl-357f02dc5f1f2ad99210faf13c2b1fd7dff6e669.zip |
Adding basic strings and symbols parsing
Diffstat (limited to 'src')
-rw-r--r-- | src/main.c | 37 |
1 files changed, 37 insertions, 0 deletions
@@ -62,6 +62,8 @@ typedef enum NodeKind { | |||
62 | NODE_BITLSHIFT, | 62 | NODE_BITLSHIFT, |
63 | NODE_BITRSHIFT, | 63 | NODE_BITRSHIFT, |
64 | // Literals. | 64 | // Literals. |
65 | NODE_STRING, | ||
66 | NODE_SYMBOL, | ||
65 | NODE_NUM_INT, | 67 | NODE_NUM_INT, |
66 | NODE_NUM_FLOAT, | 68 | NODE_NUM_FLOAT, |
67 | NODE_TRUE, | 69 | NODE_TRUE, |
@@ -93,6 +95,8 @@ Str node_str[] = { | |||
93 | [NODE_BITLSHIFT] = cstr("BITLSHIFT"), | 95 | [NODE_BITLSHIFT] = cstr("BITLSHIFT"), |
94 | [NODE_BITRSHIFT] = cstr("BITRSHIFT"), | 96 | [NODE_BITRSHIFT] = cstr("BITRSHIFT"), |
95 | // Literals. | 97 | // Literals. |
98 | [NODE_STRING] = cstr("STRING"), | ||
99 | [NODE_SYMBOL] = cstr("SYMBOL"), | ||
96 | [NODE_NUM_INT] = cstr("INT"), | 100 | [NODE_NUM_INT] = cstr("INT"), |
97 | [NODE_NUM_FLOAT] = cstr("FLOAT"), | 101 | [NODE_NUM_FLOAT] = cstr("FLOAT"), |
98 | [NODE_TRUE] = cstr("TRUE"), | 102 | [NODE_TRUE] = cstr("TRUE"), |
@@ -109,6 +113,8 @@ typedef struct Node { | |||
109 | union { | 113 | union { |
110 | f64 d; | 114 | f64 d; |
111 | sz i; | 115 | sz i; |
116 | Str str; | ||
117 | Str sym; | ||
112 | } value; | 118 | } value; |
113 | struct Node *left; | 119 | struct Node *left; |
114 | struct Node *right; | 120 | struct Node *right; |
@@ -176,6 +182,8 @@ void parse_unary(Parser *parser); | |||
176 | void parse_binary(Parser *parser); | 182 | void parse_binary(Parser *parser); |
177 | void parse_number(Parser *parser); | 183 | void parse_number(Parser *parser); |
178 | void parse_literal(Parser *parser); | 184 | void parse_literal(Parser *parser); |
185 | void parse_string(Parser *parser); | ||
186 | void parse_symbol(Parser *parser); | ||
179 | 187 | ||
180 | ParseRule parse_rules[] = { | 188 | ParseRule parse_rules[] = { |
181 | [TOK_LPAREN] = {parse_grouping, NULL, PREC_NONE}, | 189 | [TOK_LPAREN] = {parse_grouping, NULL, PREC_NONE}, |
@@ -202,6 +210,8 @@ ParseRule parse_rules[] = { | |||
202 | [TOK_BITLSHIFT] = {NULL, parse_binary, PREC_BITSHIFT}, | 210 | [TOK_BITLSHIFT] = {NULL, parse_binary, PREC_BITSHIFT}, |
203 | [TOK_BITRSHIFT] = {NULL, parse_binary, PREC_BITSHIFT}, | 211 | [TOK_BITRSHIFT] = {NULL, parse_binary, PREC_BITSHIFT}, |
204 | // Literals. | 212 | // Literals. |
213 | [TOK_STRING] = {parse_string, NULL, PREC_NONE}, | ||
214 | [TOK_SYMBOL] = {parse_symbol, NULL, PREC_NONE}, | ||
205 | [TOK_NUM_INT] = {parse_number, NULL, PREC_NONE}, | 215 | [TOK_NUM_INT] = {parse_number, NULL, PREC_NONE}, |
206 | [TOK_NUM_FLOAT] = {parse_number, NULL, PREC_NONE}, | 216 | [TOK_NUM_FLOAT] = {parse_number, NULL, PREC_NONE}, |
207 | [TOK_TRUE] = {parse_literal, NULL, PREC_NONE}, | 217 | [TOK_TRUE] = {parse_literal, NULL, PREC_NONE}, |
@@ -377,6 +387,31 @@ parse_number(Parser *parser) { | |||
377 | } | 387 | } |
378 | 388 | ||
379 | void | 389 | void |
390 | parse_string(Parser *parser) { | ||
391 | Token prev = parser->previous; | ||
392 | #if DEBUG == 1 | ||
393 | print("parsing string "); | ||
394 | print_token(prev); | ||
395 | #endif | ||
396 | Node *node = node_alloc(NODE_STRING, prev, parser->storage); | ||
397 | node->value.str = str_remove_prefix(prev.val, cstr("\"")); | ||
398 | node->value.str = str_remove_suffix(node->value.str, cstr("\"")); | ||
399 | array_push(parser->nodes, node, parser->storage); | ||
400 | } | ||
401 | |||
402 | void | ||
403 | parse_symbol(Parser *parser) { | ||
404 | Token prev = parser->previous; | ||
405 | #if DEBUG == 1 | ||
406 | print("parsing string "); | ||
407 | print_token(prev); | ||
408 | #endif | ||
409 | Node *node = node_alloc(NODE_STRING, prev, parser->storage); | ||
410 | node->value.sym = prev.val; | ||
411 | array_push(parser->nodes, node, parser->storage); | ||
412 | } | ||
413 | |||
414 | void | ||
380 | parse_grouping(Parser *parser) { | 415 | parse_grouping(Parser *parser) { |
381 | #if DEBUG == 1 | 416 | #if DEBUG == 1 |
382 | print("parsing group "); | 417 | print("parsing group "); |
@@ -396,6 +431,8 @@ graph_node(Node *node) { | |||
396 | switch (node->kind) { | 431 | switch (node->kind) { |
397 | case NODE_NUM_INT: print("| Value: %d", node->value.i); break; | 432 | case NODE_NUM_INT: print("| Value: %d", node->value.i); break; |
398 | case NODE_NUM_FLOAT: print("| Value: %f{2}", node->value.d); break; | 433 | case NODE_NUM_FLOAT: print("| Value: %f{2}", node->value.d); break; |
434 | case NODE_STRING: print("| Value: %s", node->value.str); break; | ||
435 | case NODE_SYMBOL: print("| Value: %s", node->value.sym); break; | ||
399 | default: break; | 436 | default: break; |
400 | } | 437 | } |
401 | print("| Line: %d | Col: %d ", node->line, node->col); | 438 | print("| Line: %d | Col: %d ", node->line, node->col); |