- From: Bert Bos <bert@w3.org>
- Date: Wed, 17 Feb 2010 17:47:32 +0100
- To: www-style@w3.org
On Wednesday 16 December 2009 22:17:48 L. David Baron wrote:
> In http://www.w3.org/mid/4A71E157.20600@inkedblade.net the working
> group resolved to add min() and max() to calc(), as well as allowing
> them at the top level where calc() is allowed. I don't think
> anybody has drafted any of the text for this yet, though, so here's
> an attempt at the grammar, which seems to me to be the main
> interesting part.
[...]
> (I don't see any reason to add min() and max() to <number-term>.)
No reason, except maybe consistency. I don't mind either way. I have
tried to write down the resulting complete grammar myself and came up
with the following. The first one allows min() and max() over unitless
numbers:
S: calc | min | max;
calc: "calc(" S* sum ")" S*;
min: "min(" S* sum [ "," S* sum ]* ")" S*;
max: "max(" S* sum [ "," S* sum ]* ")" S*;
sum: product [ addop product ]*;
addop: "+" S* | "-" S*;
product: [ factor "*" S* ]? dimen
[ [ "*" | "/" ] S* factor | "mod" S* dimen ]*;
factor: num [ mulop num ]*;
mulop: "*" S* | "/" S* | "mod" S*;
dimen: ["+"|"-"]? [ DIMENSION | min | max | "(" S* sum ")" S* ];
num: ["+"|"-"]? [ NUMBER | umin | umax | "(" S* factor ")" S* ];
umin: "min(" S* factor [ "," S* factor ] ")" S*;
umax: "max(" S* factor [ "," S* factor ] ")" S*;
Here is one where min() and max() only work over values with dimensions:
S: calc | min | max;
calc: "calc(" S* sum ")" S*;
min: "min(" S* sum [ "," S* sum ]* ")" S*;
max: "max(" S* sum [ "," S* sum ]* ")" S*;
sum: product [ addop product ]*;
addop: "+" S* | "-" S*;
product: [ factor "*" S* ]? dimen
[ [ "*" | "/" ] S* factor | "mod" S* dimen ]*;
factor: num [ mulop num ]*;
mulop: "*" S* | "/" S* | "mod" S*;
dimen: ["+"|"-"]? [ DIMENSION | min | max | "(" S* sum ")" S* ];
num: ["+"|"-"]? [ NUMBER | "(" S* factor ")" S* ];
There is an extra constraint that the units of the DIMENSION tokens must
be valid for the property they are used on. E.g., both 'width'
and 'pause' accept 'calc()' as a value, but the former only accepts
length units, while the latter only accepts time units. You cannot
do 'calc(5cm + 3s)'. I don't think it's worth writing separate grammars
for the different dimensions.
I hesitated over one thing: is is allowed to write a unary minus before
a parenthesis or a nested max()?
7em + -(4cm - 3%) + -max(3%, 4pc)
It wasn't allowed in the latest draft, nor in David's modifications, but
I added it anyway.
I don't think the grammar is LL(1) yet.
Bert
--
Bert Bos ( W 3 C ) http://www.w3.org/
http://www.w3.org/people/bos W3C/ERCIM
bert@w3.org 2004 Rt des Lucioles / BP 93
+33 (0)4 92 38 76 92 06902 Sophia Antipolis Cedex, France
Received on Wednesday, 17 February 2010 16:47:51 UTC