diff options
| author | iamcheeseman <[email protected]> | 2026-04-07 10:46:07 -0400 |
|---|---|---|
| committer | iamcheeseman <[email protected]> | 2026-04-07 10:46:07 -0400 |
| commit | 6d30c64216cd4d0b1b2a20a167d85c7fc6534378 (patch) | |
| tree | 67d0600f9be759c2c76b3e017b286354b57ab00a /uscript/parser.c | |
| parent | d39f7a08461b64c7378f007761d51208c226f4a4 (diff) | |
microscript: add arrays
Diffstat (limited to 'uscript/parser.c')
| -rw-r--r-- | uscript/parser.c | 39 |
1 files changed, 38 insertions, 1 deletions
diff --git a/uscript/parser.c b/uscript/parser.c index 857fad3..404e5e5 100644 --- a/uscript/parser.c +++ b/uscript/parser.c @@ -346,6 +346,29 @@ void parse_literal(struct parser *p) } static +void parse_arr(struct parser *p) +{ + int arr_len = 0; + if (p->cur.kind != ']') { + do { + if (p->cur.kind == ']') + break; + expr(p); + arr_len++; + } while (consume(p, ',')); + } + + expect(p, ']', "unterminated array literal"); + + if (arr_len > UINT8_MAX) { + show_error(p, p->prev, "too many literals the array (max 255)"); + } + + parser_add_byte(p, BC_ARR); + parser_add_byte(p, (u8)arr_len); +} + +static void parse_ident(struct parser *p) { struct token ident = p->prev; @@ -439,12 +462,26 @@ void parse_call(struct parser *p) } static +void parse_index(struct parser *p) +{ + expr(p); + expect(p, ']', "expected ']'"); + + if (consume(p, '=')) { + expr(p); + parser_add_byte(p, BC_SET_INDEX); + } else { + parser_add_byte(p, BC_GET_INDEX); + } +} + +static struct expr expressions[] = { ['('] = {parse_grouping, parse_call, PREC_CALL}, [')'] = {NULL, NULL, PREC_NONE}, ['{'] = {NULL, NULL, PREC_NONE}, ['}'] = {NULL, NULL, PREC_NONE}, - ['['] = {NULL, NULL, PREC_NONE}, + ['['] = {parse_arr, parse_index, PREC_CALL}, [']'] = {NULL, NULL, PREC_NONE}, [','] = {NULL, NULL, PREC_NONE}, [';'] = {NULL, NULL, PREC_NONE}, |
