5

让我们看一下这个 CSS 规则:

#foo { color: red; }

如您所见,上述规则的声明块包含一个声明,即color: red. 但是,根据我对 CSS 标准的解释,上面的声明块还包含第二个空声明,它位于 chars;}.

#foo { color: red; }
                  ^ --- an empty declaration is located here

我在 Stack Overflow 上提出这个问题,以确定我的解释是否正确,即上述 CSS 规则中是否确实存在第二个空声明。

顺便说一句,我使用的是 CSS 2.1 标准,特别是“Chapter 4: Syntax”,因为“CSS Syntax”模块已经过时,使用起来不安全。

好的,让我解释一下。我的解释基于以下定义:

  • 该标准规定,在声明块中,分号是出现各个声明之间的分隔符:

    声明块以左花括号 ({) 开始,并以匹配的右花括号 (}) 结束。在两者之间必须有零个或多个分号分隔 (;) 声明的列表。

    所以,根据上面的定义,分号只能出现两个声明之间,即分号必须在声明之前和声明之后。

  • 该标准将声明定义为:

    声明要么为空,要么由属性名称、后跟冒号 (:) 和属性值组成。

    上面的定义表明声明可以为空。不幸的是,该标准没有定义术语“空声明”,该术语也没有在标准的其他任何地方提及。

让我们回到这个例子:

#foo { color: red; }

上述规则是有效的 CSS。通过应用分号的定义(从上面),此规则中的分号必须在前面和后面都有一个声明。但是,分号后面是右花括号(结束声明)。为了解释这个矛盾,我在 and 之间插入了一个空声明;}并提供了这个定义:

空声明是在声明块中需要声明但未找到的位置中没有声明。

这种对标准的解释是否正确,声明块是否确实包含两个声明?

4

3 回答 3

2

我同意你的观点,读物表明你的情况是一个空洞的声明。;实际上,在大多数情况下,您的参考页面在其示例中的结束大括号之前没有 final 。我认为您的定义很接近,但并没有完全触及“空”的想法。反而:

空声明是在需要声明的声明块中没有任何内容的声明。

或者,鉴于此处的注释,这...

空声明是在需要声明的声明块中的内容不超过空格的声明。

Contra Jukka 关于“没有实际影响......没有影响”的评论我倾向于认为会有一个非常轻微的影响,因为它们是对这样一个代码块进行的额外解析(意识到,正如一些人似乎认为的那样)认为我在争论的时候不是,它没有功能效果)。该页面指出:

该规范将忽略定义为意味着用户代理解析非法部分(以便找到它的开始和结束),但在其他方面就像它不存在一样。

虽然空声明不是非法的,但我相信解析器需要执行一个额外的步骤来确定它是空的,然后才能意识到它位于声明块的末尾。

于 2012-12-07T21:22:06.303 回答
2

是的,这在将分号定义为分隔符而不是语句(或声明或其他)的一部分的计算机语言中是正常的。没有其他可能的解释,这个问题没有实际影响,因为空洞的声明没有效果。

于 2012-12-07T21:03:02.600 回答
1

乍一看,规范在这方面似乎略有不一致;尽管您引用了这些段落,但形式语法declaration产生式定义为property ':' S* expr prio?,它永远不会为空。但是,无论何时declaration出现在任何其他产生式中,它总是后面跟着?,将其标记为可选;换句话说,语法允许的任何地方declaration,它也允许[无]。

我们可以通过说出现在规范的英文散文中的术语“声明”指的是declaration?( declaration-or-[nothing]) 而不是declaration;来解决不一致的问题。但我认为主要的要点是这并不重要。规范以这样一种方式编写,即空声明确实没有任何效果。

(嘿,情况可能更糟。标准 ML允许空声明,允许在声明之间省略分号;因此可以将类似的东西val a = 7 val b = 20解析为任意多个空声明的序列,并混入两个非空声明。)

于 2012-12-07T21:13:48.167 回答