Re: problem with t040103-ident-03-c.htm?

fantasai <> wrote:

> Stewart Brodie wrote:
> > fantasai wrote:
> >> According to
> >>
> > > an ID selector is an identifier, and these are not allowed to start
> > > with a hyphen plus a number. I just checked with Bert, and he agrees
> > > the test is correct.
> > 
> > OK.  Given that it must be an identifier, is there are reason why the
> > rule in the grammar (in both specifications) should not be corrected to:
> > 
> > "#"{ident}   { return HASH;}
> > 
> > and delete the definition of 'name' completely?  This would make the
> > grammar agree with the prose.  Apart from preventing "#-<digit>" being a
> > HASH token, it would also prevent "#--" from generating a HASH token -
> > also a correct change, I believe.
> > 
> > On reflection, this would have a knock-on effect in parsers that expect
> > a HASH token for the value of a color property, of course.  Is that the
> > reason why the grammar is still as it is?  If it is, I think that
> > inserting a comment at the top of the lexical scanner would be a
> > worthwhile addition.
> Yeah, using the same token for both colors and IDs was imho not a very
> good idea. If you write up the exact changes necessary to split them, I
> can add this to the issues list. :)
> ~fantasai

It can be done a couple of different ways, I think.  The simplest way to
change it would be to ensure that idents are no longer valid names.  Change
the definition of name such that the first character after the optional
hyphen cannot come from the intersection of nmstart and nmchar.  The way to
do this would be the same for both specs:

name       [-]?[0-9-]{nmchar}*


"#"{ident}      return HASH
"#"{name}       return HASHNAME

and then in the CSS2.1 spec:

    [ HASH | HASHNAME ] S*

[Actually, it would be better for the CSS2.1 to actually tie down the rules
for hexcolor to be 1 or 2 instances of a group of three hexadecimal digits,
but it's probably not worth going to that extreme?]

There is no ABNF definition (that I can find) for CSS3 colour values in
either CSS3 Values & Units Module or in CSS3 Color Module: it is merely
explained in the prose as a hash character followed by 3 or 6 hexadecimal
digits, so no change would be required there (the parser writer just has to
find a way of examining the token stream to determine the value)

Even that is insufficient as web browsers have quirks mode issues where they
have to deal with a string of hexadecimal characters *without* the leading #

Something that looks even simpler, but doesn't work, would be to do without
the redefinition of 'name', but that would lead to tokenisation problems
(because all idents are valid names in the existing specs).

If you don't mind the CSS2.1 and CSS3 Selectors diverging, you could simply
change the Selectors spec to make the HASH token be "#"{ident} and then
delete name altogether, since the specification is only concerned with the
grammar of selectors and then it becomes the Color module's problem.  I'm
not sure I like the idea of divergence, though.

Stewart Brodie
Software Engineer
ANT Software Limited

Received on Wednesday, 22 August 2007 17:19:27 UTC