summaryrefslogtreecommitdiff
path: root/uscript/parser.c
diff options
context:
space:
mode:
Diffstat (limited to 'uscript/parser.c')
-rw-r--r--uscript/parser.c39
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},