From a324baae03e4018c2c1aa8e4692505f8fcbe7172 Mon Sep 17 00:00:00 2001 From: John Mark Bell Date: Wed, 30 Jul 2008 20:05:15 +0000 Subject: Implement the first-stage parser. Things missing: 1) Recovery after parse errors 2) Event emission (the locations of DEBUG_EVENTS are about right for this) 3) A second-stage parser 4) Any kind of testsuite svn path=/trunk/libcss/; revision=4825 --- docs/Grammar | 210 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 210 insertions(+) create mode 100644 docs/Grammar (limited to 'docs') diff --git a/docs/Grammar b/docs/Grammar new file mode 100644 index 0000000..0fd27d3 --- /dev/null +++ b/docs/Grammar @@ -0,0 +1,210 @@ +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, ';', '}', ':' + + -- cgit v1.2.3