// ECMA-262 12.3 Left-Hand-Side Expressions

        public List<Node> parseArguments()
        {
            List<Node> args = new List<Node>();
            Node expr;

            expect("(");

            if (!match(")"))
            {
                while (startIndex < length)
                {
                    if (match("..."))
                    {
                        expr = new Node();
                        lex();
                        expr.finishSpreadElement(isolateCoverGrammar(parseAssignmentExpression));
                    }
                    else
                    {
                        expr = isolateCoverGrammar(parseAssignmentExpression);
                    }
                    args.Add(expr);
                    if (match(")"))
                    {
                        break;
                    }
                    expectCommaSeparator();
                }
            }

            expect(")");

            return args;
        }
        // ECMA-262 12.2.5 Array Initializer

        public Node parseArrayInitializer()
        {
            List<Node> elements = new List<Node>();
            Node node = new Node();
            Node restSpread;

            expect("[");

            while (!match("]"))
            {
                if (match(","))
                {
                    lex();
                    elements.Add(null);
                }
                else if (match("..."))
                {
                    restSpread = new Node();
                    lex();
                    restSpread.finishSpreadElement(inheritCoverGrammar(parseAssignmentExpression));

                    if (!match("]"))
                    {
                        isAssignmentTarget = isBindingElement = false;
                        expect(",");
                    }
                    elements.Add(restSpread);
                }
                else
                {
                    elements.Add(inheritCoverGrammar(parseAssignmentExpression));

                    if (!match("]"))
                    {
                        expect(",");
                    }
                }
            }

            lex();

            return node.finishArrayExpression(elements);
        }