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, ';', '}', ':'


