From 6d30c64216cd4d0b1b2a20a167d85c7fc6534378 Mon Sep 17 00:00:00 2001 From: iamcheeseman Date: Tue, 7 Apr 2026 10:46:07 -0400 Subject: microscript: add arrays --- uscript/parser.c | 39 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) (limited to 'uscript/parser.c') diff --git a/uscript/parser.c b/uscript/parser.c index 857fad3..404e5e5 100644 --- a/uscript/parser.c +++ b/uscript/parser.c @@ -345,6 +345,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) { @@ -438,13 +461,27 @@ void parse_call(struct parser *p) parser_add_byte(p, argc); } +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}, -- cgit v1.3-2-g0d8e