18

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

例如,在 HTML

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

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

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

但我的问题是为什么会这样?为什么在设计上是不允许的?我提到“按设计”是因为我真的怀疑这是因为解析问题,我猜解析器完全有能力跟踪 opens/*并用相应的 close s 关闭评论*/但他们只是以某种方式认为这不是一个好主意.

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

那么,我想知道的是为什么在几种现代语言中通常不允许嵌套注释?除了“别人不做,我们也不做”之外,一定有充分的理由吧?

另外,还有其他(不是那么晦涩)允许嵌套块注释的语言吗?

4

3 回答 3

18

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

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

再次出于效率的原因,词法分析传统上是通过有限状态机实现的。这些有限状态机碰巧可以识别(=处理)正则语言,这非常适合上述标记。但是,它无法识别嵌套结构——这需要更强大的机器(由堆栈增强)。

因此,不允许嵌套注释只是一个以便利性换取性能的决定,随后的语言基本上都采用了该约定。

另外,还有其他(不是那么晦涩)允许嵌套块注释的语言吗?

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

于 2013-06-26T19:02:41.197 回答
0

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

如果你真的想注释掉一段 HTML,甚至使用其中包含 HTML 标记的单个注释通常都不是一个好主意,但开始嵌套注释尤其糟糕。

您永远无法绝对确定浏览器在解析语法时将如何处理它。

于 2013-06-26T19:05:10.233 回答
-3

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

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

于 2013-06-26T19:05:49.017 回答