Expanded grammar rules====================== This file provides a fully-expanded version of (a slightly modified)forward-compatible CSS grammar. See CSS3 Syntax $4.3.2 for the compact version. start -> ws stylesheet EOF stylesheet -> CDO ws stylesheetstylesheet -> CDC ws stylesheetstylesheet -> statement stylesheetstylesheet -> statement -> rulesetstatement -> at-rule ruleset -> selector '{' ws ruleset-endruleset -> '{' ws ruleset-end ruleset-end -> declaration decl-list '}' wsruleset-end -> decl-list '}' ws at-rule -> ATKEYWORD ws any0 at-rule-end at-rule-end -> blockat-rule-end -> ';' ws block -> '{' ws block-content '}' ws block-content -> any block-contentblock-content -> block block-contentblock-content -> ATKEYWORD ws block-contentblock-content -> ';' ws block-contentblock-content -> selector -> any1 declaration -> property ':' ws value1 decl-list -> ';' ws decl-list-enddecl-list -> decl-list-end -> declaration decl-listdecl-list-end -> decl-list property -> IDENT ws value0 -> value value0value0 -> value1 -> value value0 value -> anyvalue -> blockvalue -> ATKEYWORD ws any0 -> any any0any0 -> any1 -> any any0 any -> IDENT wsany -> NUMBER wsany -> PERCENTAGE wsany -> DIMENSION wsany -> STRING wsany -> CHAR wsany -> URI wsany -> HASH wsany -> UNICODE-RANGE wsany -> INCLUDES wsany -> DASHMATCH wsany -> PREFIXMATCH wsany -> SUFFIXMATCH wsany -> SUBSTRINGMATCH wsany -> FUNCTION ws any0 ')' wsany -> '(' ws any0 ')' wsany -> '[' ws any0 ']' ws ws -> S wsws -> Differences from the specification---------------------------------- 1) The start non-terminal has been introduced. It eats any leading whitespace and handles EOF.2) The "stylesheet -> S stylesheet" production has been removed.3) The "stylesheet -> CDO stylesheet" production has been changed to "stylesheet -> CDO ws stylesheet".4) The "stylesheet -> CDC stylesheet" production has been changed to "stylesheet -> CDC ws stylesheet". Essentially, the above changes remove the expectation of leading whitespacefrom the stylesheet non-terminal. This is handled by either the startnon-terminal, or by the changes made to the production rules for the stylesheetnon-terminal. Note that the "stylesheet -> statement stylesheet" productiondoes not require modification as the statement production rule already consumesany whitespace following the statement. If '{', '}', '[', ']', '(', ')', and ';' are omitted from any, then the abovegrammar is LL(1). Nullable productions-------------------- stylesheet, block-content, decl-list, decl-list-end, value0, any0, ws FIRST sets---------- start CDO, CDC, S, IDENT, NUMBER, PERCENTAGE, DIMENSION, STRING, CHAR, URI, HASH, UNICODE-RANGE, INCLUDES, DASHMATCH, PREFIXMATCH, SUFFIXMATCH, SUBSTRINGMATCH, FUNCTION, '(', '[', '{', ATKEYWORD, EOFstylesheet CDO, CDC, IDENT, NUMBER, PERCENTAGE, DIMENSION, STRING, CHAR, URI, HASH, UNICODE-RANGE, INCLUDES, DASHMATCH, PREFIXMATCH, SUFFIXMATCH, SUBSTRINGMATCH, FUNCTION, '(', '[', '{', ATKEYWORDstatement IDENT, NUMBER, PERCENTAGE, DIMENSION, STRING, CHAR, URI, HASH, UNICODE-RANGE, INCLUDES, DASHMATCH, PREFIXMATCH, SUFFIXMATCH, SUBSTRINGMATCH, FUNCTION, '(', '[', '{', ATKEYWORDruleset IDENT, NUMBER, PERCENTAGE, DIMENSION, STRING, CHAR, URI, HASH, UNICODE-RANGE, INCLUDES, DASHMATCH, PREFIXMATCH, SUFFIXMATCH, SUBSTRINGMATCH, FUNCTION, '(', '[', '{'ruleset-end IDENT, ';'at-rule ATKEYWORDat-rule-end '{', ';'block '{'block-content IDENT, NUMBER, PERCENTAGE, DIMENSION, STRING, CHAR, URI, HASH, UNICODE-RANGE, INCLUDES, DASHMATCH, PREFIXMATCH, SUFFIXMATCH, SUBSTRINGMATCH, FUNCTION, '(', '[', '{', ATKEYWORD, ';'selector IDENT, NUMBER, PERCENTAGE, DIMENSION, STRING, CHAR, URI, HASH, UNICODE-RANGE, INCLUDES, DASHMATCH, PREFIXMATCH, SUFFIXMATCH, SUBSTRINGMATCH, FUNCTION, '(', '['declaration IDENTdecl-list ';', '}'decl-list-end IDENT, ';', '}'property IDENTvalue0 IDENT, NUMBER, PERCENTAGE, DIMENSION, STRING, CHAR, URI, HASH, UNICODE-RANGE, INCLUDES, DASHMATCH, PREFIXMATCH, SUFFIXMATCH, SUBSTRINGMATCH, FUNCTION, '(', '[', '{', ATKEYWORDvalue1 IDENT, NUMBER, PERCENTAGE, DIMENSION, STRING, CHAR, URI, HASH, UNICODE-RANGE, INCLUDES, DASHMATCH, PREFIXMATCH, SUFFIXMATCH, SUBSTRINGMATCH, FUNCTION, '(', '[', '{', ATKEYWORDvalue IDENT, NUMBER, PERCENTAGE, DIMENSION, STRING, CHAR, URI, HASH, UNICODE-RANGE, INCLUDES, DASHMATCH, PREFIXMATCH, SUFFIXMATCH, SUBSTRINGMATCH, FUNCTION, '(', '[', '{', ATKEYWORDany0 IDENT, NUMBER, PERCENTAGE, DIMENSION, STRING, CHAR, URI, HASH, UNICODE-RANGE, INCLUDES, DASHMATCH, PREFIXMATCH, SUFFIXMATCH, SUBSTRINGMATCH, FUNCTION, '(', '['any1 IDENT, NUMBER, PERCENTAGE, DIMENSION, STRING, CHAR, URI, HASH, UNICODE-RANGE, INCLUDES, DASHMATCH, PREFIXMATCH, SUFFIXMATCH, SUBSTRINGMATCH, FUNCTION, '(', '['any IDENT, NUMBER, PERCENTAGE, DIMENSION, STRING, CHAR, URI, HASH, UNICODE-RANGE, INCLUDES, DASHMATCH, PREFIXMATCH, SUFFIXMATCH, SUBSTRINGMATCH, FUNCTION, '(', '['ws S FOLLOW sets----------- startstylesheet EOFstatement CDO, CDC, IDENT, NUMBER, PERCENTAGE, DIMENSION, STRING, CHAR, URI, HASH, UNICODE-RANGE, INCLUDES, DASHMATCH, PREFIXMATCH, SUFFIXMATCH, SUBSTRINGMATCH, FUNCTION, '(', '[', '{', ATKEYWORD, EOFruleset CDO, CDC, IDENT, NUMBER, PERCENTAGE, DIMENSION, STRING, CHAR, URI, HASH, UNICODE-RANGE, INCLUDES, DASHMATCH, PREFIXMATCH, SUFFIXMATCH, SUBSTRINGMATCH, FUNCTION, '(', '[', '{', ATKEYWORD, EOFruleset-end CDO, CDC, IDENT, NUMBER, PERCENTAGE, DIMENSION, STRING, CHAR, URI, HASH, UNICODE-RANGE, INCLUDES, DASHMATCH, PREFIXMATCH, SUFFIXMATCH, SUBSTRINGMATCH, FUNCTION, '(', '[', '{', ATKEYWORD, EOFat-rule CDO, CDC, IDENT, NUMBER, PERCENTAGE, DIMENSION, STRING, CHAR, URI, HASH, UNICODE-RANGE, INCLUDES, DASHMATCH, PREFIXMATCH, SUFFIXMATCH, SUBSTRINGMATCH, FUNCTION, '(', '[', '{', ATKEYWORD, EOFat-rule-end CDO, CDC, IDENT, NUMBER, PERCENTAGE, DIMENSION, STRING, CHAR, URI, HASH, UNICODE-RANGE, INCLUDES, DASHMATCH, PREFIXMATCH, SUFFIXMATCH, SUBSTRINGMATCH, FUNCTION, '(', '[', '{', ATKEYWORD, EOFblock CDO, CDC, IDENT, NUMBER, PERCENTAGE, DIMENSION, STRING, CHAR, URI, HASH, UNICODE-RANGE, INCLUDES, DASHMATCH, PREFIXMATCH, SUFFIXMATCH, SUBSTRINGMATCH, FUNCTION, '(', '[', '{', ATKEYWORD, EOF, ';', '}'block-content '}'selector '{'declaration ';', '}'decl-list '}'decl-list-end '}'property ':'value0 ';', '}'value1 ';', '}'value IDENT, NUMBER, PERCENTAGE, DIMENSION, STRING, CHAR, URI, HASH, UNICODE-RANGE, INCLUDES, DASHMATCH, PREFIXMATCH, SUFFIXMATCH, SUBSTRINGMATCH, FUNCTION, '(', '[', '{', ATKEYWORD, ';', '}'any0 '{', ';', ')', ']'any1 '{'any IDENT, NUMBER, PERCENTAGE, DIMENSION, STRING, CHAR, URI, HASH, UNICODE-RANGE, INCLUDES, DASHMATCH, PREFIXMATCH, SUFFIXMATCH, SUBSTRINGMATCH, FUNCTION, '(', '[', '{', ';', ATKEYWORD, '}'ws CDO, CDC, IDENT, NUMBER, PERCENTAGE, DIMENSION, STRING, CHAR, URI, HASH, UNICODE-RANGE, INCLUDES, DASHMATCH, PREFIXMATCH, SUFFIXMATCH, SUBSTRINGMATCH, FUNCTION, '(', '[', '{', ATKEYWORD, EOF, ';', '}', ':'
Expanded grammar rules
======================
This file provides a fully-expanded version of (a slightly modified)
forward-compatible CSS grammar. See CSS3 Syntax $4.3.2 for the compact version.
start -> ws stylesheet EOF
stylesheet -> CDO ws stylesheet
stylesheet -> CDC ws stylesheet
stylesheet -> statement stylesheet
stylesheet ->
statement -> ruleset
statement -> at-rule
ruleset -> selector '{' ws ruleset-end
ruleset -> '{' ws ruleset-end
ruleset-end -> declaration decl-list '}' ws
ruleset-end -> decl-list '}' ws
at-rule -> ATKEYWORD ws any0 at-rule-end
at-rule-end -> block
at-rule-end -> ';' ws
block -> '{' ws block-content '}' ws
block-content -> any block-content
block-content -> block block-content
block-content -> ATKEYWORD ws block-content
block-content -> ';' ws block-content
block-content ->
selector -> any1
declaration -> property ':' ws value1
decl-list -> ';' ws decl-list-end
decl-list ->
decl-list-end -> declaration decl-list
decl-list-end -> decl-list
property -> IDENT ws
value0 -> value value0
value0 ->
value1 -> value value0
value -> any
value -> block
value -> ATKEYWORD ws
any0 -> any any0
any0 ->
any1 -> any any0
any -> IDENT ws
any -> NUMBER ws
any -> PERCENTAGE ws
any -> DIMENSION ws
any -> STRING ws
any -> CHAR ws
any -> URI ws
any -> HASH ws
any -> UNICODE-RANGE ws
any -> INCLUDES ws
any -> DASHMATCH ws
any -> PREFIXMATCH ws
any -> SUFFIXMATCH ws
any -> SUBSTRINGMATCH ws
any -> FUNCTION ws any0 ')' ws
any -> '(' ws any0 ')' ws
any -> '[' ws any0 ']' ws
ws -> S ws
ws ->
Differences from the specification
----------------------------------
1) The start non-terminal has been introduced. It eats any leading whitespace
and handles EOF.
2) The "stylesheet -> S stylesheet" production has been removed.
3) The "stylesheet -> CDO stylesheet" production has been changed to
"stylesheet -> CDO ws stylesheet".
4) The "stylesheet -> CDC stylesheet" production has been changed to
"stylesheet -> CDC ws stylesheet".
Essentially, the above changes remove the expectation of leading whitespace
from the stylesheet non-terminal. This is handled by either the start
non-terminal, or by the changes made to the production rules for the stylesheet
non-terminal. Note that the "stylesheet -> statement stylesheet" production
does not require modification as the statement production rule already consumes
any whitespace following the statement.
If '{', '}', '[', ']', '(', ')', and ';' are omitted from any, then the above
grammar is LL(1).
Nullable productions
--------------------
stylesheet, block-content, decl-list, decl-list-end, value0, any0, ws
FIRST sets
----------
start CDO, CDC, S, IDENT, NUMBER, PERCENTAGE, DIMENSION, STRING,
CHAR, URI, HASH, UNICODE-RANGE, INCLUDES, DASHMATCH,
PREFIXMATCH, SUFFIXMATCH, SUBSTRINGMATCH, FUNCTION, '(',
'[', '{', ATKEYWORD, EOF
stylesheet CDO, CDC, IDENT, NUMBER, PERCENTAGE, DIMENSION, STRING,
CHAR, URI, HASH, UNICODE-RANGE, INCLUDES, DASHMATCH,
PREFIXMATCH, SUFFIXMATCH, SUBSTRINGMATCH, FUNCTION, '(',
'[', '{', ATKEYWORD
statement IDENT, NUMBER, PERCENTAGE, DIMENSION, STRING, CHAR, URI, HASH,
UNICODE-RANGE, INCLUDES, DASHMATCH, PREFIXMATCH, SUFFIXMATCH,
SUBSTRINGMATCH, FUNCTION, '(', '[', '{', ATKEYWORD
ruleset IDENT, NUMBER, PERCENTAGE, DIMENSION, STRING, CHAR, URI, HASH,
UNICODE-RANGE, INCLUDES, DASHMATCH, PREFIXMATCH, SUFFIXMATCH,
SUBSTRINGMATCH, FUNCTION, '(', '[', '{'
ruleset-end IDENT, ';'
at-rule ATKEYWORD
at-rule-end '{', ';'
block '{'
block-content IDENT, NUMBER, PERCENTAGE, DIMENSION, STRING, CHAR, URI, HASH,
UNICODE-RANGE, INCLUDES, DASHMATCH, PREFIXMATCH, SUFFIXMATCH,
SUBSTRINGMATCH, FUNCTION, '(', '[', '{', ATKEYWORD, ';'
selector IDENT, NUMBER, PERCENTAGE, DIMENSION, STRING, CHAR, URI, HASH,
UNICODE-RANGE, INCLUDES, DASHMATCH, PREFIXMATCH, SUFFIXMATCH,
SUBSTRINGMATCH, FUNCTION, '(', '['
declaration IDENT
decl-list ';', '}'
decl-list-end IDENT, ';', '}'
property IDENT
value0 IDENT, NUMBER, PERCENTAGE, DIMENSION, STRING, CHAR, URI, HASH,
UNICODE-RANGE, INCLUDES, DASHMATCH, PREFIXMATCH, SUFFIXMATCH,
SUBSTRINGMATCH, FUNCTION, '(', '[', '{', ATKEYWORD
value1 IDENT, NUMBER, PERCENTAGE, DIMENSION, STRING, CHAR, URI, HASH,
UNICODE-RANGE, INCLUDES, DASHMATCH, PREFIXMATCH, SUFFIXMATCH,
SUBSTRINGMATCH, FUNCTION, '(', '[', '{', ATKEYWORD
value IDENT, NUMBER, PERCENTAGE, DIMENSION, STRING, CHAR, URI, HASH,
UNICODE-RANGE, INCLUDES, DASHMATCH, PREFIXMATCH, SUFFIXMATCH,
SUBSTRINGMATCH, FUNCTION, '(', '[', '{', ATKEYWORD
any0 IDENT, NUMBER, PERCENTAGE, DIMENSION, STRING, CHAR, URI, HASH,
UNICODE-RANGE, INCLUDES, DASHMATCH, PREFIXMATCH, SUFFIXMATCH,
SUBSTRINGMATCH, FUNCTION, '(', '['
any1 IDENT, NUMBER, PERCENTAGE, DIMENSION, STRING, CHAR, URI, HASH,
UNICODE-RANGE, INCLUDES, DASHMATCH, PREFIXMATCH, SUFFIXMATCH,
SUBSTRINGMATCH, FUNCTION, '(', '['
any IDENT, NUMBER, PERCENTAGE, DIMENSION, STRING, CHAR, URI, HASH,
UNICODE-RANGE, INCLUDES, DASHMATCH, PREFIXMATCH, SUFFIXMATCH,
SUBSTRINGMATCH, FUNCTION, '(', '['
ws S
FOLLOW sets
-----------
start
stylesheet EOF
statement CDO, CDC, IDENT, NUMBER, PERCENTAGE, DIMENSION, STRING,
CHAR, URI, HASH, UNICODE-RANGE, INCLUDES, DASHMATCH,
PREFIXMATCH, SUFFIXMATCH, SUBSTRINGMATCH, FUNCTION, '(',
'[', '{', ATKEYWORD, EOF
ruleset CDO, CDC, IDENT, NUMBER, PERCENTAGE, DIMENSION, STRING,
CHAR, URI, HASH, UNICODE-RANGE, INCLUDES, DASHMATCH,
PREFIXMATCH, SUFFIXMATCH, SUBSTRINGMATCH, FUNCTION, '(',
'[', '{', ATKEYWORD, EOF
ruleset-end CDO, CDC, IDENT, NUMBER, PERCENTAGE, DIMENSION, STRING,
CHAR, URI, HASH, UNICODE-RANGE, INCLUDES, DASHMATCH,
PREFIXMATCH, SUFFIXMATCH, SUBSTRINGMATCH, FUNCTION, '(',
'[', '{', ATKEYWORD, EOF
at-rule CDO, CDC, IDENT, NUMBER, PERCENTAGE, DIMENSION, STRING,
CHAR, URI, HASH, UNICODE-RANGE, INCLUDES, DASHMATCH,
PREFIXMATCH, SUFFIXMATCH, SUBSTRINGMATCH, FUNCTION, '(',
'[', '{', ATKEYWORD, EOF
at-rule-end CDO, CDC, IDENT, NUMBER, PERCENTAGE, DIMENSION, STRING,
CHAR, URI, HASH, UNICODE-RANGE, INCLUDES, DASHMATCH,
PREFIXMATCH, SUFFIXMATCH, SUBSTRINGMATCH, FUNCTION, '(',
'[', '{', ATKEYWORD, EOF
block CDO, CDC, IDENT, NUMBER, PERCENTAGE, DIMENSION, STRING,
CHAR, URI, HASH, UNICODE-RANGE, INCLUDES, DASHMATCH,
PREFIXMATCH, SUFFIXMATCH, SUBSTRINGMATCH, FUNCTION, '(',
'[', '{', ATKEYWORD, EOF, ';', '}'
block-content '}'
selector '{'
declaration ';', '}'
decl-list '}'
decl-list-end '}'
property ':'
value0 ';', '}'
value1 ';', '}'
value IDENT, NUMBER, PERCENTAGE, DIMENSION, STRING, CHAR, URI, HASH,
UNICODE-RANGE, INCLUDES, DASHMATCH, PREFIXMATCH, SUFFIXMATCH,
SUBSTRINGMATCH, FUNCTION, '(', '[', '{', ATKEYWORD, ';', '}'
any0 '{', ';', ')', ']'
any1 '{'
any IDENT, NUMBER, PERCENTAGE, DIMENSION, STRING, CHAR, URI, HASH,
UNICODE-RANGE, INCLUDES, DASHMATCH, PREFIXMATCH, SUFFIXMATCH,
SUBSTRINGMATCH, FUNCTION, '(', '[', '{', ';', ATKEYWORD, '}'
ws CDO, CDC, IDENT, NUMBER, PERCENTAGE, DIMENSION, STRING,
CHAR, URI, HASH, UNICODE-RANGE, INCLUDES, DASHMATCH,
PREFIXMATCH, SUFFIXMATCH, SUBSTRINGMATCH, FUNCTION, '(',
'[', '{', ATKEYWORD, EOF, ';', '}', ':'