如果该分号后跟一个右括号,那么在最后一个分号后面会出现一个空声明吗?

时间:2012-12-07 20:49:22

标签: css

让我们看看这个CSS规则:

#foo { color: red; }

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

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

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

顺便说一下,我正在使用CSS 2.1标准,特别是"Chapter 4: Syntax",因为"CSS Syntax"模块已过时,并且使用起来不安全。

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

  • 标准规定,在声明块中,分号是分隔符出现个别声明:

      

    声明块以左大括号({)开头,以匹配的右大括号(})结束。在它们之间必须有一个零或多个以分号分隔(;)声明的列表。

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

    < / LI>
  • 该标准将声明定义为:

      

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

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

让我们回到这个例子:

#foo { color: red; }

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

  

空声明是声明块中某个位置没有声明,声明我需要但未找到。

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

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

我同意你的看法,说明你的情况显示一个空的声明。实际上,在大多数情况下,您的参考页面在其示例中的结束括号之前没有最终;。我认为你的定义很接近,但并没有完全触及'#34;空的想法。&#34;代替:

  

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

或者,given the note here,这......

  

空声明是一个不超过空格作为内容的声明   在需要声明的声明栏内。

Contra Jukka的评论&#34;没有实际影响......没有效果,&#34; 我倾向于认为会有如此轻微的影响 因为他们是为这样的代码块做一个额外的解析(实现,正如一些人似乎认为的那样)当我不在时,我在争论它没有功能效果)。页面说明:

  

此规范将ignore定义为表示用户代理正在解析   非法部分(为了找到它的开始和结束),但是   否则就好像它不在那里一样。

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

答案 2 :(得分:1)

乍一看,规范似乎在这方面略有不一致;尽管您引用了段落,但the formal grammardeclaration制作定义为property ':' S* expr prio?,这绝不是空的。但是,只要declaration出现在任何其他作品中,就会始终跟?,将其标记为可选;换句话说,在语法允许declaration的任何地方,它也允许[无]。

我们可以通过说出“规范”这一术语来解决这种不一致性,该术语出现在规范的英文散文中,是指declaration?declaration - 或 - [无])而不是{{{ 1}};但我认为主要的关键点是无关紧要。规范的编写方式使得空声明真的没有效果。

(嘿,可能会更糟。Standard ML允许空声明,允许在声明之间省略分号;因此像declaration这样的东西可以解析为任意多个空声明的序列,其中混合了两个非空声明。)