aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2024-06-16 22:25:37 +0200
committerBad Diode <bd@badd10de.dev>2024-06-16 22:25:37 +0200
commit357f02dc5f1f2ad99210faf13c2b1fd7dff6e669 (patch)
treee0f1616ca87597b8dc710e6dc00fe7ac6479d68f /src
parent3922b262aef17be3fcee90db969aca5b0edc617e (diff)
downloadbdl-357f02dc5f1f2ad99210faf13c2b1fd7dff6e669.tar.gz
bdl-357f02dc5f1f2ad99210faf13c2b1fd7dff6e669.zip
Adding basic strings and symbols parsing
Diffstat (limited to 'src')
-rw-r--r--src/main.c37
1 files changed, 37 insertions, 0 deletions
diff --git a/src/main.c b/src/main.c
index 8892a60..75faaf6 100644
--- a/src/main.c
+++ b/src/main.c
@@ -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);
176void parse_binary(Parser *parser); 182void parse_binary(Parser *parser);
177void parse_number(Parser *parser); 183void parse_number(Parser *parser);
178void parse_literal(Parser *parser); 184void parse_literal(Parser *parser);
185void parse_string(Parser *parser);
186void parse_symbol(Parser *parser);
179 187
180ParseRule parse_rules[] = { 188ParseRule 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
379void 389void
390parse_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
402void
403parse_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
414void
380parse_grouping(Parser *parser) { 415parse_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);