- From: Yves Lafon <ylafon@w3.org>
- Date: Fri, 20 Feb 2009 09:10:23 -0500 (EST)
- To: www-style@w3.org
Dear CSSers, Here are some issues with the current grammar, as defined by http://www.w3.org/TR/CSS21/grammar.html dated 20070719, amended by the errata at http://www.w3.org/Style/css2-updates/CR-CSS21-20070719-errata.html) I/ Collision in "import" definition. stylesheet : [ CHARSET_SYM STRING ';' ]? [S|CDO|CDC]* [ import [S|CDO|CDC]* ]* [ [ ruleset | media | page ] [S|CDO|CDC]* ]* import : IMPORT_SYM S* [STRING|URI] S* [ medium [ COMMA S* medium]* ]? ';' S* The final S* of the import rule collides with the S in [ import [S|CDO|CDC]* ]* The issue might be solved in two ways: 1/ In the 'stylesheet' rule: [ import [S|CDO|CDC]* ]* => [ import [[CDO|CDC] [S|CDO|CDC]*]? ]* 2/ In the 'import' rule: [STRING|URI] S* [ medium [ COMMA S* medium]* ]? ';' S* => [STRING|URI] S* [ medium [ COMMA S* medium]* ]? ';' II / Collision in stylesheet and ruleset/media/page Same issue, the final S* of 'ruleset' 'media' and 'page' conflicts with [S|CDO|CDC]* To solve this one, the same two ways are possible: 1/ In the 'stylesheet' rule [ [ ruleset | media | page ] [S|CDO|CDC]* ]* => [ [ ruleset | media | page ] [[CDO|CDC] [S|CDO|CDC]]?* ]* 2/ In the 'media' rule MEDIA_SYM S* medium [ COMMA S* medium ]* LBRACE S* ruleset* '}' S* => MEDIA_SYM S* medium [ COMMA S* medium ]* LBRACE S* ruleset* S* '}' In the 'page' rule LBRACE S* declaration [ ';' S* declaration ]* '}' S* => LBRACE S* declaration [ ';' S* declaration ]* '}' In the 'ruleset' rule LBRACE S* declaration [ ';' S* declaration ]* '}' S* => LBRACE S* declaration [ ';' S* declaration ]* '}' III / Error in the 'page' rule PAGE_SYM S* pseudo_page? S* is problematic when pseudo_page is not present. The following soles that issue. PAGE_SYM S* (pseudo_page S*)? IV / Error in the 'pseudo' rule Same as in III/ ':' [ IDENT | FUNCTION S* IDENT? S* ')' ] should read ':' [ IDENT | FUNCTION S* (IDENT S*)? ')' ] V / empty tokens To avoid empty tokens in the grammar, here are the proposed changes: 1/ in "operator" '/' S* | COMMA S* | /* empty */ => '/' S* | COMMA S* or even [ '/' | COMMA ] S* (Note, COMMA includes {w}, which is not the case for '/'. Same comment in the definition of 'unary_operator') in "expr" term [ operator term ]* => term [ operator? term ]* 2/ in "declaration" property ':' S* expr prio? | /* empty */ => property ':' S* expr prio? in "page" LBRACE S* declaration [ ';' S* declaration ]* '}' S* => LBRACE S* declaration? [ ';' S* declaration? ]* '}' S* in "ruleset" LBRACE S* declaration [ ';' S* declaration ]* '}' S* => LBRACE S* declaration? [ ';' S* declaration? ]* '}' S* (note that in 'page' and 'ruleset' the final S* might be dropped, depending on the resolution of the issue II above). Cheers, -- Baroula que barouleras, au tiéu toujou t'entourneras. ~~Yves
Received on Friday, 20 February 2009 14:10:31 UTC