11<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
22<html lang="en">
3- <!-- $Id: grammar.src,v 2.41 2005-03-02 04:41:45 bbos Exp $ -->
3+ <!-- $Id: grammar.src,v 2.42 2005-04-12 14:02:15 bbos Exp $ -->
44<HEAD>
55<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
66<TITLE>Grammar of CSS 2.1</TITLE>
@@ -150,21 +150,41 @@ title="iso-10646">ISO-10646</span>.
150150h [0-9a-f]
151151nonascii [\200-\377]
152152unicode \\{h}{1,6}(\r\n|[ \t\r\n\f])?
153- escape {unicode}|\\[ -~\200-\377 ]
153+ escape {unicode}|\\[^\r\n\f0-9a-f ]
154154nmstart [_a-z]|{nonascii}|{escape}
155155nmchar [_a-z0-9-]|{nonascii}|{escape}
156- string1 \"([\t !#$%&(-~]|\\{nl}|\'|{nonascii}|{escape})*\"
157- string2 \'([\t !#$%&(-~]|\\{nl}|\"|{nonascii}|{escape})*\'
156+ string1 \"([^\n\r\f\\"]|\\{nl}|{escape})*\"
157+ string2 \'([^\n\r\f\\']|\\{nl}|{escape})*\'
158+ invalid1 \"([^\n\r\f\\"]|\\{nl}|{escape})*
159+ invalid2 \'([^\n\r\f\\']|\\{nl}|{escape})*
158160
159161ident -?{nmstart}{nmchar}*
160162name {nmchar}+
161163num [0-9]+|[0-9]*"."[0-9]+
162164string {string1}|{string2}
165+ invalid {invalid1}|{invalid2}
163166url ([!#$%&*-~]|{nonascii}|{escape})*
164167s [ \t\r\n\f]
165168w {s}*
166169nl \n|\r\n|\r|\f
167170
171+ A a|\\0{0,4}(41|61)(\r\n|[ \t\r\n\f])?
172+ C c|\\0{0,4}(43|63)(\r\n|[ \t\r\n\f])?
173+ D d|\\0{0,4}(44|64)(\r\n|[ \t\r\n\f])?
174+ E e|\\0{0,4}(45|65)(\r\n|[ \t\r\n\f])?
175+ G g|\\0{0,4}(47|67)(\r\n|[ \t\r\n\f])?|\\g
176+ H h|\\0{0,4}(48|68)(\r\n|[ \t\r\n\f])?|\\h
177+ I i|\\0{0,4}(49|69)(\r\n|[ \t\r\n\f])?|\\i
178+ K k|\\0{0,4}(4b|6b)(\r\n|[ \t\r\n\f])?|\\k
179+ M m|\\0{0,4}(4d|6d)(\r\n|[ \t\r\n\f])?|\\m
180+ N n|\\0{0,4}(4e|6e)(\r\n|[ \t\r\n\f])?|\\n
181+ P p|\\0{0,4}(50|70)(\r\n|[ \t\r\n\f])?|\\p
182+ R r|\\0{0,4}(52|72)(\r\n|[ \t\r\n\f])?|\\r
183+ S s|\\0{0,4}(53|73)(\r\n|[ \t\r\n\f])?|\\s
184+ T t|\\0{0,4}(54|74)(\r\n|[ \t\r\n\f])?|\\t
185+ X x|\\0{0,4}(58|78)(\r\n|[ \t\r\n\f])?|\\x
186+ Z z|\\0{0,4}(5a|7a)(\r\n|[ \t\r\n\f])?|\\z
187+
168188%%
169189
170190{s}+ {return S;}
@@ -183,6 +203,7 @@ nl \n|\r\n|\r|\f
183203{w}"," {return COMMA;}
184204
185205{string} {return STRING;}
206+ {invalid} {return INVALID; /* unclosed string */}
186207
187208{ident} {return IDENT;}
188209
@@ -195,21 +216,23 @@ nl \n|\r\n|\r|\f
195216
196217"!"{w}"important" {return IMPORTANT_SYM;}
197218
198- {num}em {return EMS;}
199- {num}ex {return EXS;}
200- {num}px {return LENGTH;}
201- {num}cm {return LENGTH;}
202- {num}mm {return LENGTH;}
203- {num}in {return LENGTH;}
204- {num}pt {return LENGTH;}
205- {num}pc {return LENGTH;}
206- {num}deg {return ANGLE;}
207- {num}rad {return ANGLE;}
208- {num}grad {return ANGLE;}
209- {num}ms {return TIME;}
210- {num}s {return TIME;}
211- {num}Hz {return FREQ;}
212- {num}kHz {return FREQ;}
219+ {num}{E}{M} {return EMS;}
220+ {num}{E}{X} {return EXS;}
221+ {num}{P}{X} {return LENGTH;}
222+ {num}{C}{M} {return LENGTH;}
223+ {num}{M}{M} {return LENGTH;}
224+ {num}{I}{N} {return LENGTH;}
225+ {num}{P}{T} {return LENGTH;}
226+ {num}{P}{C} {return LENGTH;}
227+ {num}{D}{E}{G} {return ANGLE;}
228+ {num}{R}{A}{D} {return ANGLE;}
229+ {num}{G}{R}{A}{D} {return ANGLE;}
230+ {num}{M}{S} {return TIME;}
231+ {num}{S} {return TIME;}
232+ {num}{H}{Z} {return FREQ;}
233+ {num}{K}{H}{Z} {return FREQ;}
234+ {num}{ident} {return DIMENSION;}
235+
213236{num}% {return PERCENTAGE;}
214237{num} {return NUMBER;}
215238
@@ -252,7 +275,7 @@ a style sheet contains a font family that has a tab in its name.
252275backslash</a>) were not allowed in strings in CSS1.
253276
254277<li>CSS2 parses a number immediately followed by an identifier as a
255- DIMEN token (i.e., an unknown unit), CSS1 parsed it as a number and an
278+ DIMENSION token (i.e., an unknown unit), CSS1 parsed it as a number and an
256279identifier. That means that in CSS1, the declaration 'font:
25728010pt/1.2serif' was correct, as was 'font: 10pt/12pt serif'; in CSS2, a
258281space is required before "serif". (Some UAs accepted the first
0 commit comments