[css4-values] Make comma auto-optional in grammars?

This is something that's been bugging me for a while.

Most of the time, CSS just uses whitespace as a separator between
values.  This works great, because if a term is omitted, the implied
whitespace on either side just collapses into a single whitespace
block, so you don't have to worry about "too much" whitespace being
left around when a term is omitted.

Sometimes, though, we use a comma to separate terms, and it doesn't
have this behavior.  If a term is completely omitted, you have to
carefully construct the grammar to force an associated comma to also
be omitted.  This distorts a bunch of grammars, forcing a lot of extra
wrappers and duplication of terms, making them harder to read than
they should be.  One of the major purposes of our grammar is to be a
relatively easily-understandable description of the allowed values, so
this is a failure.

Could we perhaps define the use of the comma in grammars to have this
behavior automatically?  Here's some before/after examples of how this
would help.

radial-gradient():
 [ [ <shape> || <size> ] [ at <position> ]? , |
    at <position>,
  ]?
  <color-stop-list>
==>
[ <shape> || <size> ]? [ at <position> ]? <color-stop-list>

image():
<image-tags>? [ <image-src> , ]* [ <image-src> | <color> ]
==>
<image-tags>? <image-src># , <color>?

image-set():
[ <image-set-decl>, ]* [ <image-set-decl> | <color>]
==>
<image-set-decl># , <color>?



Specifically, the rule would be that, a comma must be omitted if,
ignoring whitespace and comments, it would be the first or last token
in the function/property value, or if the immediately preceding token
is also a comma.  Informally, commas must separate terms, so omit them
if they don't.

~TJ

Received on Tuesday, 18 December 2012 19:30:14 UTC