W3C home > Mailing lists > Public > www-style@w3.org > August 2012

[css3-syntax] comments on parsing states

From: L. David Baron <dbaron@dbaron.org>
Date: Wed, 29 Aug 2012 00:21:11 -0700
To: www-style@w3.org
Message-ID: <20120829072111.GA5736@crum.dbaron.org>
I did a quick read through of all the parsing states in
http://dev.w3.org/csswg/css3-syntax/#tree-construction .  Comments

3.6.3 At-rule mode
  { token
    Otherwise, this is a parse error:
      The sentences "Switch to the next-block error mode. Reconsume
      the current input token." should probably be in the other
      order.  But it would be simpler to just say "Consume a
      primitive and ignore the return value" as you do in "Top-level
  additional case needed:
    You need a case for the } token.  To be compatible with CSS 2.1
    it should only apply when the at-rule is inside another rule
    (which I think means when the stack of open rules has greater
    than two items).  (However, I think it would be a reasonable
    change to make it apply always... but that probably doesn't work
    for the other cases where you need this same change.)  This case
    should say:
      Discard the current rule.  Reconsume the current input token.

3.6.4 Rule mode
  { needs to be a parse error just like in 3.6.2 Top-level mode.

3.6.5 Selector mode
  needs a case for } just as I propose above for 3.6.3.

  EOF Token
    Is discarding the current rule correct?  It seems inconistent
    with CSS 2.1's EOF rules, which should suggest leaving the rule,
    or perhaps only leaving the rule if it has a nonempty selector?

3.6.8 Declaration-value mode

  DELIM with value of !
    I think you should proceed into a new mode in which you expect
    important.  (If it's there, go to declaration-end mode.  For
    EOF, probably discard the current declaration.  And for anything
    else, reprocess the current token and go into next-declaration
    error mode.)

    Then again, this does forbid ! within the toplevel of a
    variable, as fantasai points out.

    You do need to allow whitespace and comments here somehow.

    Also, there are contexts (in particular, keyframe rules) in
    which !important is a parse error and causes the declaration to
    be discarded.  You should allow for this.

  anything else
    As I said before [1], I think these quirks should be described
    as part of the property grammar.

3.6.10 Next block error mode
  I think you can remove this given how flexible your at-rule
  parsing is (see comments on 3.6.3).  But if you don't, you need a
  case for } like for 3.6.5 and 3.6.3.

3.6.13 and 3.6.14 (quirks)
  Again, see previous post on quirks [1].

3.6.18 Pop the current rule
  The validity of the rule can depend on whether the rule was
  terminated by an EOF.  This means it can't be tested in the way
  you describe, since by this point you've lost that information.  I
  think this is fixable by having a separate state for "pop the
  current rule for an end of file".  (For example, media queries
  have similar "closing open constructs" rules to the ones rules do,
  and the validity of the @media query determines the validity of an
  @import rule.)

  It's probably also worth explicitly saying that "according to the
  appropriate grammar rules" means that errors that were handled by
  some smaller piece being discarded don't count.

  Finally, whether the current rule is valid also depends on
  context.  Some at-rules are only valid at top-level and not within
  other at rules.  Some (actually, currently, all) of these are only
  valid if the prior rules that were appended to the new current
  rule (i.e., the style sheet) were in certain categories (i.e.,
  @charset, @import, @namespace).

In general, "Reprocess the current input token" and "Reconsume the
current input token" aren't defined.  Presumably they cause the next
occurrence of "Consume the next input token" to do nothing.  You
should probably also stick to one wording.  But you also often use
them after the "switch to the ... state" wording, and I tend to
think it should be before.

You need to define that "discard the current rule" removes the rule
from the stack of open rules.

You need to define when the "current declaration" is set and unset.
It's not defined at all.


[1] end of http://lists.w3.org/Archives/Public/www-style/2012Aug/0806.html

𝄞   L. David Baron                         http://dbaron.org/   𝄂
𝄢   Mozilla                           http://www.mozilla.org/   𝄂
Received on Wednesday, 29 August 2012 07:21:39 UTC

This archive was generated by hypermail 2.4.0 : Friday, 25 March 2022 10:08:20 UTC