问题 一般来说,为什么不允许使用嵌套块注释? [关闭]


在我使用的大多数语言中,你根本无法嵌套块注释,因为“关闭”注释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和 */s for - ->s和 * /s。但这显然不方便,当您只想丢弃代码块以进行调试时很难做到。 (其他技术是将所有内容嵌入其中 if(false){} 块,但这不是重点。

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

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


12401
2018-06-26 18:57


起源

请注意,Haskell允许它。我认为有消息来源声称解析器太麻烦了,但GHC做得相当不错。 - Ziyao Wei
HTML实际上是一个糟糕的例子 - HTML中的注释更复杂。 - Konrad Rudolph
重复: programmers.stackexchange.com/questions/81072/... 和 programmers.stackexchange.com/questions/116330/... - assylias
@StinePike嵌套注释可用于添加消息,而嵌套注释用于禁用某些功能。 - Sotirios Delimanolis
@StinePike因为有时为了调试目的,你想丢弃可能已经有块注释的大块代码,并且很容易将它们包装起来 /* */ 而不是其他解决方法。 - DiegoDD


答案:


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

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

再次出于效率的原因,词法分析传统上通过一个实现 有限状态机。这些有限状态机碰巧识别(=句柄) 常规语言,完全适合上述令牌。但是,确实如此  能够识别嵌套的构造 - 这将需要一个更强大的机器(由堆栈增加)。

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

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

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


14
2018-06-26 19:02



我怀疑它,只是惯例,即使它在技术上是完全可能的(我猜也是如此)。感谢详细的信息和链接,我看到我有很多东西需要了解解析器及其工作原理。 - DiegoDD


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

如果你真的想要注释掉一段HTML,那么在它内部使用带有HTML标签的单个注释通常不是一个好主意,但是开始嵌套注释尤其糟糕。

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


0
2018-06-26 19:05



康拉德做了比我更正式的解释,认为这是他的答案的外行人版本。 - TravisO


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

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


-1
2018-06-26 19:05



“与评论不太一致” - 胡说八道。按照相同的逻辑,评论永远不会结束,因为评论结束标记 是评论的一部分。我还没有看到一个人被嵌套的Haskell或Pascal评论搞糊涂了。事实上,描述嵌套注释的简洁,正式规则的存在就是这样一条规则 必须 要自我一致。如果不是,则无法正式描述。 - Konrad Rudolph