aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2024-06-18 14:48:56 +0200
committerBad Diode <bd@badd10de.dev>2024-06-18 14:48:56 +0200
commit649b378bb01a6964b9deec4d0fe57aeae1e5cb9e (patch)
tree9ff0ded9b8b0d20a5086d7d672bb8ff2c1406483
parent9db91607a01b83a245961bdfcb72fe1234be420f (diff)
downloadbdl-649b378bb01a6964b9deec4d0fe57aeae1e5cb9e.tar.gz
bdl-649b378bb01a6964b9deec4d0fe57aeae1e5cb9e.zip
Fix a corner case with symbol indexing
-rw-r--r--src/main.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/src/main.c b/src/main.c
index 83477d8..13bd469 100644
--- a/src/main.c
+++ b/src/main.c
@@ -146,8 +146,10 @@ typedef struct Node {
146 struct Node *left; 146 struct Node *left;
147 struct Node *right; 147 struct Node *right;
148 }; 148 };
149 struct Node *next; 149 struct {
150 struct Node *arr_size; 150 struct Node *next;
151 struct Node *arr_size;
152 };
151 struct { 153 struct {
152 struct Node *var_name; 154 struct Node *var_name;
153 struct Node *var_type; 155 struct Node *var_type;
@@ -676,6 +678,13 @@ parse_symbol(Parser *parser) {
676 node->arr_size = array_pop(parser->nodes); 678 node->arr_size = array_pop(parser->nodes);
677 parse_consume(parser, TOK_RSQUARE, 679 parse_consume(parser, TOK_RSQUARE,
678 cstr("unmatched brackets ']' in array type")); 680 cstr("unmatched brackets ']' in array type"));
681 if (parse_match(parser, TOK_DOT)) {
682 // Symbol chain.
683 parse_consume(parser, TOK_SYMBOL,
684 cstr("expected symbol after '.' operator"));
685 parse_symbol(parser);
686 node->next = array_pop(parser->nodes);
687 }
679 } else { 688 } else {
680 node = node_alloc(parser, NODE_SYMBOL, prev); 689 node = node_alloc(parser, NODE_SYMBOL, prev);
681 if (!node) return; 690 if (!node) return;