Language agnostic 递归注释的语言支持
我使用过的大多数语言都不支持递归注释Language agnostic 递归注释的语言支持,language-agnostic,compiler-construction,recursion,comments,Language Agnostic,Compiler Construction,Recursion,Comments,我使用过的大多数语言都不支持递归注释 语言设计者选择不实现这一点有什么原因吗 是不是很复杂 它会有不想要的结果吗 递归注释示例: /* for (int j = 0; j <= SourceTexture.Height; j += SampleSize) { ... } // Comment within comment below: /*for (int i = 0; i < TextureColour.Length; i++) { ... }*/ sour
递归注释示例:
/*
for (int j = 0; j <= SourceTexture.Height; j += SampleSize)
{
...
}
// Comment within comment below:
/*for (int i = 0; i < TextureColour.Length; i++)
{
...
}*/
sourceTexture.SetData<Color>(TextureColour);
*/
但在我看来,这与以下情况下的意外结果没有什么不同:
/*
CODE "*/";
*/
这也会产生意想不到的结果
/*
char *str = "/* string";
// Are we now 1 level inside a comment or 2 levels?
*/
printf("Hello world");
/*
char *str2 = "string */";
*/
所以,虽然递归注释可能会有问题,但我的论点是,对于非递归注释来说,这已经是一个问题了。作为一名程序员,我知道编译器的工作方式是这样的,我会解决这个问题。我不认为用递归注释解决同一问题需要更多的努力。我将举一个例子,也许会更清楚:
/*
char *str = "/* string";
// Are we now 1 level inside a comment or 2 levels?
*/
printf("Hello world. Will this be printed? Or is it a comment?");
/*
char *str2 = "string */";
*/
如果不解释注释中的内容,则无法解析注释中的注释。但是你不能解释注释中的内容,因为它是注释,所以根据定义是“人类文本”而不是“语言”。我认为它从来没有被考虑过,随着事物的发展,它会成为一个“不重要”的特性。此外,它还需要更多的验证 示例场景 迈朗版本1:目标
- 提供多行注释
/*
我都会评论所有的东西,直到下一个*/
-简单
迈朗版本1发布版
一天后
用户:呃。。。我不能做递归评论,帮帮我
支持:请稍候
30分钟后
支持经理->开发人员:用户不能做递归注释
开发者:(什么是递归…)等等
30分钟后
开发者:是的,我们不支持递归评论
语言设计者为什么选择不这样做呢
实施这个
这使得词汇分析更难实现
是不是很复杂
不,但这是主观的
它会有不想要的结果吗
很难说。您已经发现,即使是普通的块注释也会出现问题:
/* print ("*/"); */
我知道有两种语言有嵌套块注释:和。虽然C的多行注释不能嵌套,但递归注释的效果或多或少可以在C中使用
#如果0#endif
(我强烈建议您在想要禁用代码块时使用它,正是出于这个原因)
即使是设计得像post一样愚蠢的C预处理器,也完全能够处理嵌套注释,就像它必须能够处理带有假条件的嵌套#if
指令一样。因此,这与任何难以定义或解析的内容无关,因为尽管它使注释更加复杂,但它们仍然不会比预处理中完成的其他事情更复杂
但是,使用#如果0#endif
当然要求您试图排除的代码中不存在任何不匹配的#endif
从根本上说,注释不能同时是(a)完全非结构化的和(b)递归的。不管是偶然的还是有意的选择,C都与(a)——注释文本不必遵守任何语法约束,除了不包含注释终止符序列(或trigraph等价物,如
*??/
)。为什么不去读一篇关于编译器的介绍性文章,然后回来呢?我了解编译器的基本知识,但事实上,这仅仅是基础(因此这个问题)。如果这是一个简单的/应该是显而易见的+1因为我一直讨厌这个。在现代编辑器中,这不再是一个问题(在Visual Studio中,我可以^KC,一块文本将被//注释)。虽然我对此做出了回应,但我的+1仍然存在,因为我从未想过这个问题,我讨厌它。。。现在我不再讨厌它(就像我讨厌计算机的短视:-)来扩展这个:这在扫描整个文件(或其他输入单元)后是可以决定的,但它需要更复杂的词汇扫描。@Marcin你可以在另一个注释的字符串中有*/
。。。我想这会变得很复杂。如果你有/*注释,你不会遇到同样的问题吗。。。代码“*/”代码*/
。例如,在您的示例中,可以说您处于两个级别。在您编辑的示例中,是的,这是一个问题,但您现在仍然遇到了这个问题,因此我不明白为什么它比现有的注释更像是一个问题。@GeorgeDuckett/*
始终在第一个*/
之前关闭(即使*/在中“/*”
,因此第二个可以被语言解析,如果它在“/*”
或/
注释之外,则它是一个错误。很明显,在C#/*字符串C=“*/”中,它是代码,而不是注释