follows follow first compilers compiler and css compiler-construction programming-languages grammar

follow - Gramática CSS W3C, rarezas de sintaxis



first and follows (1)

Estaba echando un vistazo a la sintaxis de CSS aquí y aquí, y me sorprendió ver las producciones de tokens y la gramática llena de declaraciones en espacios en blanco. Normalmente, el espacio en blanco se define una vez en el lexer y se omite, nunca se volverá a ver. Ditto comenta.

Me imagino que la orientación hacia los usuarios-agentes en lugar de los verdaderos compiladores es parte de la motivación aquí, y también el requisito de proceder frente a los errores, pero todavía parece bastante extraño.

¿Los UA de la vida real que analizan CSS realmente se implementan de acuerdo con esta (estas) gramáticas?

EDITAR: el motivo de la pregunta es en realidad las diversas implementaciones LESS. less.js no entiende los comentarios consecutivos, y lessc.exe no entiende los comentarios dentro de los selectores. En este sentido, ni siquiera son capaces de analizar CSS correctamente, como sea que esté definido. Entonces fui a ver cuál era la gramática real de CSS y ...


CSS, aunque es similar a muchos lenguajes de programación, tiene algunas instancias raras donde el espacio en blanco puede ser importante.

Digamos que tenemos el siguiente marcado base:

<html> <head> <style type="text/css"> .blueborder { width:200px; height:200px; border: solid 2px #00f; } .redborder { width:100px; height:100px; margin:50px; border: solid 2px #f00; } </style> </head> <body> <div class="blueborder"> <div class="redborder"></div> </div> </body> </html>

No hay nada especial aquí, excepto un div dentro de un div, con algunos estilos para que pueda ver la diferencia entre ellos.

Ahora permitamos agregar otra clase y una ID a la div externa:

<div class="blueborder MyClass" id="MyDiv"> <div class="redborder"></div> </div>

Si quiero dar un trasfondo al div externo de la siguiente manera:

.MyClass#MyDiv { background: #ccc; }

... entonces el espacio en blanco se vuelve importante. La regla anterior da estilo al div externo, ya que se analiza de forma diferente a la siguiente:

.MyClass #MyDiv { background: #ccc; }

... que NO da estilo al div externo.

Para ver cómo estos se analizan de manera diferente, puede ver cómo se seleccionan los selectores:

Ejemplo 1:

.MyClass#MyDiv -> DELIM IDENT HASH

Ejemplo2:

.MyClass #MyDiv -> DELIM IDENT S HASH

Si fuéramos a ignorar ciegamente el espacio en blanco (como suelen hacer los compiladores), perderíamos esta diferencia.

Habiendo dicho eso, no estoy insinuando que esta gramática es buena. También tengo una buena cantidad de experiencia en la escritura de gramáticas, y me estremezco al mirar esta gramática. La solución más fácil habría sido agregar el # y . símbolos en el token IDENT y luego todo lo demás se vuelve mucho más fácil.

Sin embargo, no eligieron hacer esto, y la necesidad de espacio en blanco es un artefacto de esa decisión.