diff --git a/centvrion/parser.py b/centvrion/parser.py index 5110886..5a6cf96 100644 --- a/centvrion/parser.py +++ b/centvrion/parser.py @@ -297,13 +297,10 @@ class Parser(): else: return [calls[0]] + calls[2] - @self.pg.production('array_items : ') @self.pg.production('array_items : expression') @self.pg.production('array_items : expression SYMBOL_COMMA opt_newline array_items') def array_items(calls): - if len(calls) == 0: - return [] - elif len(calls) == 1: + if len(calls) == 1: return [calls[0]] else: return [calls[0]] + calls[3] @@ -391,10 +388,19 @@ class Parser(): def dict_literal(tokens): return ast_nodes.DataDict(tokens[3]) - @self.pg.production('expression : SYMBOL_LBRACKET array_items SYMBOL_RBRACKET') + @self.pg.production('expression : SYMBOL_LBRACKET SYMBOL_RBRACKET') + @self.pg.production('expression : SYMBOL_LBRACKET newlines SYMBOL_RBRACKET') + def array_empty(_): + return ast_nodes.DataArray([]) + + @self.pg.production('expression : SYMBOL_LBRACKET array_items opt_newline SYMBOL_RBRACKET') def array(tokens): return ast_nodes.DataArray(tokens[1]) + @self.pg.production('expression : SYMBOL_LBRACKET newlines array_items opt_newline SYMBOL_RBRACKET') + def array_leading_newline(tokens): + return ast_nodes.DataArray(tokens[2]) + @self.pg.production('expression : SYMBOL_LBRACKET expression KEYWORD_VSQVE expression SYMBOL_RBRACKET') def range_array(tokens): return ast_nodes.DataRangeArray(tokens[1], tokens[3]) diff --git a/tests/07_test_arrays__.py b/tests/07_test_arrays__.py index 724c83c..e50b6d4 100644 --- a/tests/07_test_arrays__.py +++ b/tests/07_test_arrays__.py @@ -265,6 +265,26 @@ multiline_array_tests = [ DataArray([Numeral("II"), Numeral("III")]), Numeral("IV")]))]), ValList([ValInt(1), ValList([ValInt(2), ValInt(3)]), ValInt(4)])), + # empty array with newline + ("[\n]", + Program([], [ExpressionStatement(DataArray([]))]), + ValList([])), + # newline immediately after [ + ("[\nI, II, III]", + Program([], [ExpressionStatement(DataArray([Numeral("I"), Numeral("II"), Numeral("III")]))]), + ValList([ValInt(1), ValInt(2), ValInt(3)])), + # newline immediately before ] + ("[I, II, III\n]", + Program([], [ExpressionStatement(DataArray([Numeral("I"), Numeral("II"), Numeral("III")]))]), + ValList([ValInt(1), ValInt(2), ValInt(3)])), + # newlines on both sides + ("[\nI, II, III\n]", + Program([], [ExpressionStatement(DataArray([Numeral("I"), Numeral("II"), Numeral("III")]))]), + ValList([ValInt(1), ValInt(2), ValInt(3)])), + # newlines around every delimiter + ("[\nI,\nII,\nIII\n]", + Program([], [ExpressionStatement(DataArray([Numeral("I"), Numeral("II"), Numeral("III")]))]), + ValList([ValInt(1), ValInt(2), ValInt(3)])), ] class TestMultilineArray(unittest.TestCase):