- From: Boris Zbarsky <bzbarsky@MIT.EDU>
- Date: Mon, 30 Apr 2012 13:23:53 -0400
- To: www-style@w3.org
On 4/30/12 12:56 PM, Tab Atkins Jr. wrote:
> Or, wait. Actually, this grammar is busted. It is impossible to scan
> the above, since "1n" will already have been tokenized as a DIMENSION.
> Possibly browsers handle that implicitly, and *actually* match a
> grammar something like:
>
> <dimension> [ [ + | - ]<integer> ]?
> |<keyword> [ [ + | - ]<integer> ]?
> |<integer>
> | odd
> | even
>
> ...with checks that the DIMENSION and KEYWORD are just 'n'.
Hey, our mails crossed. ;)
And for what it's worth, it's even worse. To quote the Gecko source
comments from parsing this stuff:
// The CSS tokenization doesn't handle :nth-child() containing - well:
// 2n-1 is a dimension
// n-1 is an identifier
(And on a personal note, I'd like to point out that "-n-5" is likewise
an IDENT token in the tokenizer. Yay overloading of hyphen and minus!)
So in practice, what Gecko's parser does here, in pseudocode, is:
t = nextToken();
if (t.isIdent() or t.isDimension()) {
if (t.ident starts with "n-") {
push '-' and everything after it back into the scanner
set t.ident to "n"
} else if (t.ident starts with "-n-") {
push second '-' and everything after it back into the scanner
set t.ident to "-n"
}
}
if (t.isIdent()) {
// handle even and odd
if ident.is("n") {
set a = 1;
} else if ident.is("-n") {
set a = -1;
}
} else if (t.isDimension()) {
// assert t.ident is "n"
set a = t.integer;
} else if (t.isInteger()) {
set a = 0
set b = t.integer;
return;
} else {
fail();
}
// Now ask the tokenizer for the next token and handle it
// being a '+' or '-' symbol or whatnot to compute the 'b'
The end result is that Gecko allows comments or whitespace _after_ the
'n', and in cases when the 'n' is followed by a '-' makes the behavior
as if there had in fact been a comment or whitespace between them. But
no comments or whitespace before the "n" allowed: that ends up falling
into the t.isInteger() case above. This could probably be fixed if it
were really necessary, but I question how necessary it is, since no UA
actually does that. Fixing the spec would be preferable.
> So, this is a Selectors bug, not a browser bug. We can't blame
> browsers for failing to do an impossible thing. ^_^
Thanks. ;)
-Boris
Received on Monday, 30 April 2012 17:24:24 UTC