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=“*/”中,它是代码,而不是注释