Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
added missing '~=' and '|=' attrib tokens; redordered <expr> terms; u…
…se '(' ~ ')' paren matching idiom
  • Loading branch information
dwarring committed Jun 5, 2013
1 parent 82fa422 commit da7a4ed
Showing 1 changed file with 47 additions and 45 deletions.
92 changes: 47 additions & 45 deletions parsers/CSSGrammar.pm
Expand Up @@ -3,62 +3,64 @@
grammar CSSGrammar {
# builtin: ident (we use cssident), alpha

token TOP { ^ <import>* <css>* $ || <.panic: "CSS parsing failed"> };
token css { <ruleset> | <media> | <page> };
rule ruleset { <selector> +% ',' <declarations> }
rule declarations { '{' <declaration> +%% ';' '}' }
rule selector { <simple_selector> +% <combinator>? };
rule simple_selector { <element_name> [ <hcap> ]* | <hcap>+ };
token hcap { '#' | <class> | <attrib> | <pseudo> };
token class { '.' <cssident> };
token element_name { <cssident> | '*' };
token attrib { '[' <cssident> [ [ '=' | <INCLUDES> | <DASHMATCH> ] [ <cssident> | <string> ] ]? ']' };
token pseudo { ':' [ <cssident> | <FUNCTION> <cssident>? ')' ] };
token combinator { '+' | '>' };
token TOP { ^ <import>* <css>* $ || <.panic: "CSS parsing failed"> }
token css { <ruleset> | <media> | <page> }
rule ruleset { <selector> +% ',' '{' ~ '}' <declarations> }
rule declarations { <declaration> +%% ';' }
rule selector { <simple_selector> +% <combinator>? }
rule simple_selector { <element_name> [ <hcap> ]* | <hcap>+ }
token hcap { '#' | <class> | '[' ~ ']' <attrib> | <pseudo> }
token class { '.' <cssident> }
token element_name { <cssident> | '*' }
token attrib { <cssident> [ [ '=' | <INCLUDES> | <DASHMATCH> ] [ <cssident> | <string> ] ]? }
token pseudo { ':' [ <FUNCTION> ~ ')' <cssident>? | <cssident> ] }
token combinator { '+' | '>' }

rule declaration { <property> ':' <expr> <prio>? };
token property { <cssident> };
token prio { <important_sym> };
token expr { <term> +% <operator>? };
token cssident { '-'?<namestart><namechar>* };
rule declaration { <property> ':' <expr> <prio>? }
token property { <cssident> }
token prio { <important_sym> }
token expr { <term> +% <operator>? }
token cssident { '-'?<namestart><namechar>* }
rule term { <unary_operator>?
[ <number> | <percentage> | <length> | <ems> | <exs> | <angle> | <time> | <freq> ]
| <string> | <cssident> | <uri> | <hexcolor> | <function>
};
token operator { '/' | ',' };
token function { <FUNCTION> <expr> ')' };
token hexcolor { '#' };
token namestart { <alpha> | _ };
token namechar { \w | '-' };
token unary_operator { '-' | '+' };
token number { \d+ | \d* '.' \d+ };
token percentage { <number> '%' };
token length {:i <number> [ px | cm | mm | in | pt | pc ] };
token ems {:i <number>? em };
token exs {:i <number>? ex };
token angle {:i <number> [ deg | rad | grad ] };
token time {:i <number> [ ms | s ] };
token freq {:i <number> k?hz };
token string { ('"' | \') (<- [\n]>|\\ \n)*? $0 };
token uri { url '(' [ <string> | <url>] ')'};
token url { ( <- [\( \) \' \" \\]> )* };
token FUNCTION { <cssident> '(' };
token important_sym {:i '!'important };
[ <percentage> | <length> | <ems> | <exs> | <angle> | <time> | <freq> | <number> ]
| <string> | <uri> | <function> | <cssident> | <hexcolor>
}
token operator { '/' | ',' }
token function { <FUNCTION> ~ ')' <expr> }
token hexcolor { '#' }
token namestart { <alpha> | _ }
token namechar { \w | '-' }
token unary_operator { '-' | '+' }
token number { \d+ | \d* '.' \d+ }
token percentage { <number> '%' }
token length {:i <number> [ px | cm | mm | in | pt | pc ] }
token ems {:i <number>? em }
token exs {:i <number>? ex }
token angle {:i <number> [ deg | rad | grad ] }
token time {:i <number> [ ms | s ] }
token freq {:i <number> k?hz }
token string { ('"' | \') (<- nl>|\\ \n)*? $0 }
token uri { url '(' ~ ')' [ <string> | <url>] }
token url { ( <- [\( \) \' \" \\]> )* }
token FUNCTION { <cssident> '(' }
token INCLUDES { '~=' }
token DASHMATCH { '|=' }

token important_sym {:i '!'important }

rule import {:i'@import' [<string>|<uri>] <media_list>? ';' }

rule media {:i'@media' <media_list> <media_rules> }
rule media_list {<media_type> [',' <media_type>]*}
rule media_type {<cssident>}
rule media_rules { '{' <ruleset>* '}' }
rule media_list {<media_type> +%','}
rule media_type { <cssident> }
rule media_rules { '{' ~ '}' <ruleset>* }

rule page {:i'@page' [':'<cssident>]? <declarations> }

# Comments and whitespace.
token comment {'<!--' .*? '-->' | '/*' .*? '*/'}
# override <ws> builtin. Note: \n matches a logical (platform
# independent) newline in Perl 6
token ws { <!ww> [ \n | "\t" | " " | <comment> ]* }
token nl {\xA|"\r"\xA|"\r"|"\f"}
token ws { <!ww> [ nl | "\t" | " " | <comment> ]* }

method panic($e) {die $e;}
}

0 comments on commit da7a4ed

Please sign in to comment.