src/main/java/com/bazaarvoice/jless/parser/Parser.java
Rule Arguments() {
        return FirstOf(
                Sequence(
                        Ws0(), '(', Ws0(),
                        ExpressionPhrase(), push(new ArgumentsNode(new ExpressionGroupNode(pop()))),
                        Ws0(),
                        ZeroOrMore(
                                ',', Ws0(),
                                ExpressionPhrase(), peek(1).addChild(new ExpressionGroupNode(pop())),
                                Ws0()
                        ),
                        ')'
                ),
                Sequence(Ws0(), '(', Ws0(), ')', push(new ArgumentsNode()))
        );
    }
Rule Arguments() {
        return FirstOf(
                Sequence(
                        Ws0(), '(', Ws0(),
                        ExpressionPhrase(), push(new ArgumentsNode(new ExpressionGroupNode(pop()))),
                        Ws0(),
                        ZeroOrMore(
                                ',', Ws0(),
                                ExpressionPhrase(), peek(1).addChild(new ExpressionGroupNode(pop())),
                                Ws0()
                        ),
                        ')'
                ),
                Sequence(Ws0(), '(', Ws0(), ')', push(new ArgumentsNode()))
        );
    }
Rule Arguments ( ) { return FirstOf ( Sequence ( Ws0 ( ) , ' ' , Ws0 ( ) , ExpressionPhrase ( ) , push ( new ArgumentsNode ( new ExpressionGroupNode ( pop ( ) ) ) ) , Ws0 ( ) , ZeroOrMore ( ' ' , Ws0 ( ) , ExpressionPhrase ( ) , peek ( 1 ) . addChild ( new ExpressionGroupNode ( pop ( ) ) ) , Ws0 ( ) ) , ' ' ) , Sequence ( Ws0 ( ) , ' ' , Ws0 ( ) , ' ' , push ( new ArgumentsNode ( ) ) ) ) ; }
'(' Ws0 ExpressionPhrase Ws0 (',' Ws0 ExpressionPhrase Ws0)* ')' / '(' Ws0 ')'
( Ws0 ExpressionPhrase Ws0 ( Ws0 ExpressionPhrase Ws0 ) * ) / ( Ws0 )