一般来说,为什么不允许使用嵌套块注释?

时间:2013-06-26 18:57:25

标签: java php html comments nested

在我使用的大多数语言中,你根本无法嵌套块注释,因为“关闭”注释sintaxis的第一次发生就会关闭注释,即使它只是一个“内部”注释。

例如,在HTML

<!-- outer comment
<p>hello</p><!-- inner comment <p>world</p> -->
<p>this should BE commented</p>
-->

在这种情况下,外部评论会在第一个-->上结束,而不是相应的最后一个,导致最后一个<p>打印,而不应该打印。

对于使用/* */进行块注释的语言也是如此,例如java,php,css,javascript等。

但我的问题是为什么会这样?为什么在设计上不允许这样做?我提到“按设计”,因为我真的怀疑是因为解析问题,我猜解析器完全有能力跟踪打开/*并关闭评论及其相应的结束*/但是他们只是某种程度上认为这不是一个好主意。

我已经知道,解决这个问题的方法是以某种方式更改内部结束注释,以避免它们关闭,并且只留下最后一个结束注释。例如更改-->*/ s的内部- ->* / s。但这显然不方便,当您只想丢弃代码块以进行调试时很难做到。 (其他技术是将所有内容嵌套在if(false){}块中,但这不是重点。

那么,我想知道的是为什么几种现代语言通常不允许嵌套注释?必须有一个很好的理由而不是“别人不这样做,我们也不会”对吗?

另外,是否还有其他(不那么模糊)语言允许嵌套块注释?

3 个答案:

答案 0 :(得分:15)

原因是历史性的,与编译器的架构有关。

为了提高效率,大多数编译器传统上分两个阶段解析源代码:令牌流的lexical analysis和实际parsing(由所述词法分析产生)。词法分析是识别单个标记的部分,例如关键字,字符串,数字文字和评论

再次出于效率的原因,词法分析传统上是通过finite-state machine实现的。这些有限状态机碰巧识别(=句柄)regular languages,这完全适合上述令牌。但是,它 无法识别嵌套构造 - 这需要更强大的机器(augmented by a stack)。

因此,不允许嵌套注释仅仅是为了方便性能而做出的决定,后来的语言基本上采用了惯例。

  

另外,是否还有其他(不那么模糊)语言允许嵌套块注释?

有一些。评论已经提到了Haskell和Pascal。其他语言是D和F#。

答案 1 :(得分:0)

HTML通常是一种草率的,非强制类型的标记。浏览者必须在正确和现实之间做出决定,有时他们会选择第二种。

如果你真的想要评论一段HTML,那么即使在其中使用带有HTML标签的单个评论通常也不是一个好主意,但是开始嵌套评论尤其糟糕。

在解析语法时,您永远无法确定浏览器将如何处理此问题。

答案 2 :(得分:-1)

出现此行为是因为注释字符之间的任何内容都是注释,包括更多注释字符。是的,可以轻松地将解析器编程为将其视为您描述的嵌套注释,但这与注释不完全一致。注释旨在使开放字符和关闭字符之间的所有内容都不存在,无论它是什么。文本,代码和评论字符都被注释掉了。

不幸的是,你的建议原因是“其他人不这样做,所以我们也不会”也是非常正确的。人们期望阻止评论以某种方式表现,并且当他们不这样做时会感到困惑。