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令牌中,然后其他一切变得更加容易.
然而,他们没有选择这样做,并且对空白的需求是该决定的人为因素.