diff options
author | Bad Diode <bd@badd10de.dev> | 2024-06-18 14:48:56 +0200 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2024-06-18 14:48:56 +0200 |
commit | 649b378bb01a6964b9deec4d0fe57aeae1e5cb9e (patch) | |
tree | 9ff0ded9b8b0d20a5086d7d672bb8ff2c1406483 | |
parent | 9db91607a01b83a245961bdfcb72fe1234be420f (diff) | |
download | bdl-649b378bb01a6964b9deec4d0fe57aeae1e5cb9e.tar.gz bdl-649b378bb01a6964b9deec4d0fe57aeae1e5cb9e.zip |
Fix a corner case with symbol indexing
-rw-r--r-- | src/main.c | 13 |
1 files changed, 11 insertions, 2 deletions
@@ -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; |