diff --git a/source/ona/kym/Ast.zig b/source/ona/kym/Ast.zig index 48f1346..cf2b6f7 100755 --- a/source/ona/kym/Ast.zig +++ b/source/ona/kym/Ast.zig @@ -351,14 +351,6 @@ fn parse_factor(self: *Self) ParseError!Expression { break: parse .{.table_literal = table_literal}; }, - .symbol_bracket_left => { - self.tokenizer.skip_newlines(); - - if (self.tokenizer.token != .symbol_equals) { - return self.report("expected expression after identifier"); - } - }, - .symbol_period => { self.tokenizer.step(); @@ -370,15 +362,11 @@ fn parse_factor(self: *Self) ParseError!Expression { self.tokenizer.skip_newlines(); if (self.tokenizer.token != .symbol_equals) { - return self.report("expected `=` after key"); + return self.report("expected `=` after symbol"); } self.tokenizer.skip_newlines(); - if (self.tokenizer.token == .end) { - return self.report("unexpected end after `=`"); - } - try table_literal.push_one(.{ .value_expression = try self.parse_expression(), .key_expression = .{.symbol_literal = identifier}, @@ -397,6 +385,41 @@ fn parse_factor(self: *Self) ParseError!Expression { } }, + .symbol_bracket_left => { + self.tokenizer.step(); + + const index_expression = try self.parse_expression(); + + if (self.tokenizer.token != .symbol_bracket_right) { + return self.report("expected `]` expression"); + } + + self.tokenizer.skip_newlines(); + + if (self.tokenizer.token != .symbol_equals) { + return self.report("expected `=` after `]`"); + } + + self.tokenizer.skip_newlines(); + + try table_literal.push_one(.{ + .value_expression = try self.parse_expression(), + .key_expression = index_expression, + }); + + switch (self.tokenizer.token) { + .symbol_comma => self.tokenizer.skip_newlines(), + + .symbol_brace_right => { + self.tokenizer.skip_newlines(); + + break: parse .{.table_literal = table_literal}; + }, + + else => return self.report("expected `,` or `}` after expression"), + } + }, + else => return self.report("expected `}` or fields in table literal"), } } diff --git a/source/ona/kym/tokens.zig b/source/ona/kym/tokens.zig index bc916d4..2604bf8 100755 --- a/source/ona/kym/tokens.zig +++ b/source/ona/kym/tokens.zig @@ -287,6 +287,20 @@ pub const Tokenizer = struct { return; }, + '[' => { + self.token = .symbol_bracket_left; + cursor += 1; + + return; + }, + + ']' => { + self.token = .symbol_bracket_right; + cursor += 1; + + return; + }, + ',' => { self.token = .symbol_comma; cursor += 1;