Posted to tcl by colin at Mon Mar 11 22:29:23 GMT 2013view raw
- PEG css (stylesheet)
- leaf: CharSpecial <- "\\" [nrt'"\[\]\\] ;
- leaf: CharUnicode <- "\\" HexDigit (HexDigit (HexDigit HexDigit?)?)? ;
- leaf: CharUnescaped <- !"\\" . ;
- leaf: Ident <- ('_' / <alpha>) ('_' / <alnum>)* ;
- Char <- CharSpecial / CharUnicode / CharUnescaped;
- void: EOL <- "\n\r" / "\n" / "\r" ;
- void: APOSTROPH <- "'";
- void: DAPOSTROPH <- '"';
- void: COMMENT <- "/*" ([^*] [/] / "*" [^/] / nl)* "*/" ;
- void: WS <- (" " / "\t" / EOL / COMMENT)*;
- void: HexDigit <- [0-9a-fA-F] ;
- Literal <- APOSTROPH (!APOSTROPH Char)* APOSTROPH / DAPOSTROPH (!DAPOSTROPH Char)* DAPOSTROPH ;
- leaf: CDO <- "<!--";
- leaf: CDC <- "-->";
- leaf: INCLUDES <- "~=";
- leaf: DASHMATCH <- "|=";
- leaf: HASH <- "#" Ident;
- Uri <- "url" WS Literal WS;
- Function <- Ident WS "(";
- leaf: LBRACKET <- "[";
- leaf: RBRACKET <- "]";
- void: LBRACE <- "{";
- void: RBRACE <- "}";
- void: LPAREN <- "(";
- void: RPAREN <- ")";
- leaf: STAR <- "*";
- void: SEMI <- [;+];
- # stylesheet
- # : [ CHARSET_SYM STRING ';' ]?
- # [S|CDO|CDC]* [ import [ CDO S* | CDC S* ]* ]*
- # [ [ ruleset | media | page ] [ CDO S* | CDC S* ]* ]*
- # ;
- leaf: CHARSET <- "@" [Cc][Hh][Aa][Rr][Ss][Ee][Tt];
- stylesheet <- WS CHARSET Literal SEMI stylesheet /
- WS (ruleset / import / media / page) stylesheet;
- # import
- # : IMPORT_SYM S*
- # [STRING|URI] S* media_list? ';' S*
- # ;
- leaf: IMPORT <- [Ii][Mm][Pp][Oo][Rr][Tt];
- import <- IMPORT WS Literal WS media_list WS SEMI
- / IMPORT WS Literal WS SEMI
- / IMPORT WS Uri WS media_list WS SEMI
- / IMPORT WS Uri WS SEMI;
- # media
- # : MEDIA_SYM WS media_list '{' WS ruleset* '}' WS
- # ;
- leaf: MEDIA <- [Mm][Ee][Dd][Ii][Aa];
- media <- MEDIA WS media_list LBRACE WS ruleset_seq RBRACE;
- ruleset_seq <- ruleset ruleset_seq / ruleset;
- # media_list
- # : medium [ COMMA WS medium]*
- # ;
- media_list <- Ident WS COMMA WS media_list / Ident;
- # page
- # : PAGE_SYM WS pseudo_page?
- # '{' WS declaration? [ ';' WS declaration? ]* '}' WS
- # ;
- leaf: PAGE <- [Pp][Aa][Gg][Ee];
- page <- PAGE WS pseudo_page WS LBRACE WS declaration_seq RBRACE
- / PAGE WS LBRACE WS declaration_seq RBRACE;
- # pseudo_page
- # : ':' IDENT WS
- # ;
- pseudo_page <- ":" Ident;
- # operator
- # : '/' WS | ',' WS
- # ;
- operator <- [/,=];
- # combinator
- # : '+' WS
- # | '>' WS
- # ;
- combinator <- [+>];
- # unary_operator
- # : '-' | '+'
- # ;
- unary_operator <- [-+];
- # property
- # : IDENT WS
- # ;
- property <- Ident;
- # ruleset
- # : selector [ ',' WS selector ]*
- # '{' WS declaration? [ ';' WS declaration? ]* '}' WS
- # ;
- ruleset <- selector_seq WS LBRACE WS declaration_seq RBRACE;
- selector_seq <- selector WS COMMA WS selector_seq / selector;
- declaration_seq <- declaration SEMI WS declaration_seq / declaration;
- # selector
- # : simple_selector [ combinator selector | S+ [ combinator? selector ]? ]?
- # ;
- selector <- simple_selector / simple_selector WS combinator WS selector / simple_selector S WS combinator WS selector / simple_selector S WS selector;
- # simple_selector
- # : element_name [ HASH | class | attrib | pseudo ]*
- # | [ HASH | class | attrib | pseudo ]+
- # ;
- simple_selector <- element_name selector_sub / element_name / selector_sub;
- selector_sub <- HASH selector_sub
- / class selector_sub
- / attrib selector_sub
- / pseudo selector_sub
- / HASH
- / class
- / attrib
- / pseudo;
- # class
- # : '.' IDENT
- # ;
- class <- DOT Ident;
- # element_name
- # : IDENT | '*'
- # ;
- element_name <- Ident / STAR;
- # attrib
- # : '[' WS IDENT WS [ [ '=' | INCLUDES | DASHMATCH ] WS
- # [ IDENT | Literal ] WS ]? ']'
- # ;
- attrib <- LBRACKET WS IDENT WS RBRACKET /
- LBRACKET WS IDENT WS "=" WS IDENT WS RBRACKET /
- LBRACKET WS IDENT WS "=" WS Literal WS RBRACKET /
- LBRACKET WS IDENT WS INCLUDES WS IDENT WS RBRACKET /
- LBRACKET WS IDENT WS INCLUDES WS Literal WS RBRACKET /
- LBRACKET WS IDENT WS DASHMATCH WS IDENT WS RBRACKET /
- LBRACKET WS IDENT WS DASHMATCH WS Literal WS RBRACKET;
- # pseudo
- # : ':' [ IDENT | FUNCTION WS [IDENT WS]? ')' ]
- # ;
- pseudo <- ":" IDENT / ":" FUNCTION WS RPAREN / ":" FUNCTION WS IDENT WS RPAREN;
- # declaration
- # : property ':' WS expr prio?
- # ;
- leaf: IMPORTANT <- "!" WS [Ii][Mm][Pp][Oo][Rr][Tt][Aa][Nn][Tt];
- declaration <- property WS ":" WS expr / property WS ":" WS expr WS IMPORTANT;
- # expr
- # : term [ operator? term ]*
- # ;
- expr <- term / term WS expr WS / term WS operator WS expr;
- # term
- # : unary_operator?
- # [ NUMBER WS | PERCENTAGE WS | LENGTH WS | EMS WS | EXS WS | ANGLE WS |
- # TIME WS | FREQ WS ]
- # | Literal WS | IDENT WS | URI WS | hexcolor | function
- # ;
- term <- unary_operator term_numeric / term_numeric / Literal / Ident / Uri / hexcolor / function;
- Digits <- [0-9]+;
- Length <- Digits ([Pp][Xx] / [Cc][Mm] / [Mm][Mm] / [Ii][Nn] / [Pp][Tt] / [Pp][Cc]);
- Angle <- Digits ([Dd][Ee][Gg] / [Rr][Aa][Dd] / [Gg][Rr][Aa][Dd]);
- Time <- Digits ([Mm][Ss] / [Ss]);
- Freq <- Digits ([Hh][Zz] / [Kk][Hh][Zz]);
- Dimension <- "<digit>"+ Ident;
- Percentage <- "<digit>" "%";
- Sign <- [-+];
- Number <- Sign? "<ddigit>"+;
- EMS <- Digits [Ee][Mm];
- EXS <- Digits [Ee][Xx];
- term_numeric <- Number / Percentage / Length / EMS / EXS / Angle / Time / Freq;
- # function
- # : FUNCTION WS expr ')' WS
- # ;
- function <- Function WS expr RPAREN WS;
- # /*
- # * There is a constraint on the color that it must
- # * have either 3 or 6 hex-digits (i.e., [0-9a-fA-F])
- # * after the "#"; e.g., "#000" is OK, but "#abcd" is not.
- # */
- # hexcolor
- # : HASH WS
- # ;
- hexcolor <- Hash;
- END;