为什么通常不允许嵌套块注释?[已关闭]

2022-08-30 22:24:08

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

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

另外,是否有任何其他(不那么晦涩难懂的)语言允许嵌套块注释?


答案 1

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

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

同样,出于效率的原因,词法分析传统上是通过有限状态机实现的。这些有限状态机碰巧识别(=句柄)常规语言,这非常适合上述标记。但是,它无法识别嵌套结构 - 这将需要更强大的机器(由堆栈增强)。

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

另外,是否有任何其他(不那么晦涩难懂的)语言允许嵌套块注释?

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


答案 2

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

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

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


推荐