src/main/java/com/bazaarvoice/jless/parser/Parser.java
Rule Declaration() {
        return FirstOf(
                Sequence(
                        FirstOf(
                                Sequence(PropertyName(), push(new PropertyNode(match()))),
                                Sequence(Variable(), push(new VariableDefinitionNode(match())), peek().setVisible(!isParserTranslationEnabled()))
                        ), Ws0(),
                        ':', Ws0(),
                        push(new ExpressionGroupNode()),
                        ExpressionPhrase(), peek(1).addChild(pop()),
                        ZeroOrMore(
                                Ws0(), ',', Ws0Nodes(),
                                ExpressionPhrase(), peek(1).addChild(pop())
                        ),
                        Sp0(), FirstOf(';', Sequence(Ws0(), Test('}' ))),
                        peek(1).addChild(pop())
                ),
                // Empty rules are ignored
                Sequence(
                        Ident(), push(new PlaceholderNode()), Ws0(),
                        ':', Ws0(),
                        ';'
                )
        );
    }
Rule Declaration() {
        return FirstOf(
                Sequence(
                        FirstOf(
                                Sequence(PropertyName(), push(new PropertyNode(match()))),
                                Sequence(Variable(), push(new VariableDefinitionNode(match())), peek().setVisible(!isParserTranslationEnabled()))
                        ), Ws0(),
                        ':', Ws0(),
                        push(new ExpressionGroupNode()),
                        ExpressionPhrase(), peek(1).addChild(pop()),
                        ZeroOrMore(
                                Ws0(), ',', Ws0Nodes(),
                                ExpressionPhrase(), peek(1).addChild(pop())
                        ),
                        Sp0(), FirstOf(';', Sequence(Ws0(), Test('}' ))),
                        peek(1).addChild(pop())
                ),
                // Empty rules are ignored
                Sequence(
                        Ident(), push(new PlaceholderNode()), Ws0(),
                        ':', Ws0(),
                        ';'
                )
        );
    }
Rule Declaration ( ) { return FirstOf ( Sequence ( FirstOf ( Sequence ( PropertyName ( ) , push ( new PropertyNode ( match ( ) ) ) ) , Sequence ( Variable ( ) , push ( new VariableDefinitionNode ( match ( ) ) ) , peek ( ) . setVisible ( ! isParserTranslationEnabled ( ) ) ) ) , Ws0 ( ) , ' ' , Ws0 ( ) , push ( new ExpressionGroupNode ( ) ) , ExpressionPhrase ( ) , peek ( 1 ) . addChild ( pop ( ) ) , ZeroOrMore ( Ws0 ( ) , ' ' , Ws0Nodes ( ) , ExpressionPhrase ( ) , peek ( 1 ) . addChild ( pop ( ) ) ) , Sp0 ( ) , FirstOf ( ' ' , Sequence ( Ws0 ( ) , Test ( ' ' ) ) ) , peek ( 1 ) . addChild ( pop ( ) ) ) , // Empty rules are ignored Sequence ( Ident ( ) , push ( new PlaceholderNode ( ) ) , Ws0 ( ) , ' ' , Ws0 ( ) , ' ' ) ) ; }
(Ident / Variable) Ws0 ':' Ws0 ExpressionPhrase (Ws0 ',' Ws0 ExpressionPhrase)* Sp0 (';' / Ws0 &'}')
/ Ident Ws0 ':' Ws0 ';'

Ex: @my-var: 12px; height: 100%;
( Ident / Variable ) Ws0 : Ws0 ExpressionPhrase ( Ws0 Ws0 ExpressionPhrase ) * Sp0 ( ; / Ws0 & } ) / Ident Ws0 : Ws0 ;