NAME

CSS::Selector::Grammar - Generate parse trees for CSS3 selectors.

VERSION

version 0.002

SYNOPSIS

use CSS::Selector::Grammar;

my $ast = parse_selector('html|*:not(:link):not(:visited)');

DESCRIPTION

CSS::Selector::Grammar translates the grammar defined in http://www.w3.org/TR/css3-selectors/#w3cselgrammar into the Regexp::Grammars formalism with a few minimal changes in structure, but not semantics, to facilitate examining the resulting parse tree.

CSS::Selector::Grammar exports one function by default: parse_selector. If you are using Regexp::Grammars, it also defines two grammars: CSS3::Lexemes and CSS3::Selectors.

In addition to the normal output of Regexp::Grammars, certain nodes in the CSS selector parse trees will have an i attribute representing the index of their first character. E.g.,

parse_selector('*[foo]');

gives you

{
    ''                => '*[foo]',
    'selectors_group' => {
        ''         => '*[foo]',
        'selector' => [
            {
                ''      => '*[foo]',
                'first' => {
                    ''                 => '*[foo]',
                    'initial_selector' => {
                        ''          => '*',
                        'universal' => {
                            ''  => '*',
                            'i' => '0'
                        }
                    },
                    'simple_selector_sequence_element' => [
                        {
                            ''       => '[foo]',
                            'attrib' => {
                                ''            => '[foo]',
                                'attrib_name' => {
                                    ''      => 'foo',
                                    'IDENT' => {
                                        ''  => 'foo',
                                        'i' => '2'
                                    }
                                }
                            }
                        }
                    ]
                }
            }
        ]
    }
};

In general, identifiers and strings will have their index indicated.

FUNCTIONS

parse_selector

my $ast = parse_selector($expression);

For a given selector returns a parse tree, or undef if the grammar cannot parse the expression.

KNOWN BUGS

Regexp::Grammars itself does not work with Perl version 5.18, so if that's your version, CSS::Selector::Grammar won't work for you either. I suggest you try App::perlbrew.

AUTHOR

David F. Houghton <dfhoughton@gmail.com>

COPYRIGHT AND LICENSE

This software is copyright (c) 2014 by David F. Houghton.

This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.