W3C CSS语法,语法怪异

use*_*421 10 css compiler-construction grammar programming-languages

我在这里这里看一下CSS语法,我很惊讶地看到令牌产生和语法乱七八糟的空格声明.通常在词法分析器中定义一次空格并跳过,永远不会再被看到.同上评论.

我认为对用户代理而不是真正的编译器的定位是这里动机的一部分,也是面对错误的要求,但它似乎仍然很奇怪.

解析CSS的真实UA是否真的根据这些(这些)语法实现了?

编辑:问题的原因实际上是各种LESS实现.less.js不理解连续的注释,并且lessc.exe不理解选择器内的注释.在这方面,他们甚至无法正确解析CSS,无论如何定义.所以我去看看CSS的实际语法是什么......

riw*_*alk 25

CSS虽然与许多编程语言类似,但确实有一些罕见的实例,其中空白可能很重要.


假设我们有以下基本标记:

<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>
Run Code Online (Sandbox Code Playgroud)

这里没什么特别的,除了div里面的div,上面有一些样式,这样你就可以看到它们之间的区别.

现在让我们在外部div中添加另一个类和一个ID:

<div class="blueborder MyClass" id="MyDiv">
    <div class="redborder"></div>
</div>
Run Code Online (Sandbox Code Playgroud)

如果我想以下列方式给出外部 div 的背景:

.MyClass#MyDiv { background: #ccc; }
Run Code Online (Sandbox Code Playgroud)

......然后空白就变得很重要了.上面的规则确实为外部div设置了样式,因为它的解析方式与以下内容不同:

.MyClass #MyDiv { background: #ccc; }
Run Code Online (Sandbox Code Playgroud)

...没有设计外部div的样式.

要查看这些是如何以不同方式解析的,您可以查看选择器的标记方式:

例1:

.MyClass#MyDiv -> DELIM IDENT HASH
Run Code Online (Sandbox Code Playgroud)

例2:

.MyClass #MyDiv -> DELIM IDENT S HASH
Run Code Online (Sandbox Code Playgroud)

如果我们盲目地忽略空白(正如编译器通常那样),我们会错过这种差异.


话虽如此,我并不是说这个语法很好.我在编写语法方面也有相当多的经验,在看这个语法时我很畏缩.最简单的解决方案是将ID #.符号添加到IDENT令牌中,然后其他一切变得更加容易.

然而,他们没有选择这样做,并且对空白的需求是该决定的人为因素.