语言支持递归注释

时间:2011-10-24 08:30:42

标签: language-agnostic compiler-construction recursion comments

我使用过的大多数语言都不支持递归评论。

  1. 语言设计师有没有理由选择不实施这个?
  2. 这看起来很复杂吗?
  3. 会有不良后果吗?

  4. 递归评论的示例:

    /*
    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);
    */
    

    编辑:我理解到目前为止答案的论点(当你在字符串中注释令牌时会出现问题)。但是,我混淆的原因是你现在遇到了这个问题。

    例如,我知道下面的代码不会给出预期的结果。

    /*
        char *str = "/* string";
        // Are we now 1 level inside a comment or 2 levels?
    
    */
    
    printf("Hello world");
    
    /*
        char *str2 = "string */";
    */
    

    但在我看来,这与下面的案例中的意外结果没有什么不同:

    /*
    CODE "*/";
    */
    

    这也会产生意外/不受欢迎的结果。

    因此,虽然它可能是递归注释的问题,但我关于为什么这不是不这样做的理由的论点是,它已经是非递归注释的问题。作为程序员,我知道编译器的行为与此类似,我可以解决它。我不认为用递归评论来解决同样的问题会更加努力。

4 个答案:

答案 0 :(得分:2)

我会举个例子,也许会更清楚:

/*
    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 :(得分:2)

  

语言设计师选择不这样做是否有任何理由   实现这个?

这使得词法分析更难实现。

  

这看起来很复杂吗?

恕我直言,不,但这是主观的。

  

会有不良后果吗?

很难说。您已经发现即使是正常的块注释也可能会出现问题:

/* print ("*/");    */

我知道2种语言具有嵌套数据评论:HaskellFrege

答案 2 :(得分:1)

虽然C的多行注释无法嵌套,但使用#if 0 ... #endif在C语言中或多或少可以实现递归注释的效果(我强烈建议您在禁用时使用它代码块,正是出于这个原因)。

即使是设计为像帖子一样愚蠢的C预处理器,也完全有能力处理嵌套注释,就像它必须能够处理带有错误条件的嵌套#if指令一样。所以它并不是真的与任何难以定义或解析的东西有关,因为虽然它使注释更复杂,但它们仍然不会比预处理中的其他事情复杂。

但是,使用#if 0 ... #endif当然要求您尝试排除的代码中没有任何不匹配的#endif

根本上,评论既不能(a)完全非结构化,也不能(b)递归。无论是通过偶然选择还是故意选择,C都带有(a) - 评论文本除了不包含注释终结符序列(或者诸如*??/<newline>/之类的三字形等价物)之外,不必遵守任何语法约束。 / p>

答案 3 :(得分:0)

我相信它从来没有被考虑过,随着事物的发展它变成了一个“非重要”的功能。此外,它还需要更多验证。

示例场景......

MyLang版本1:目标

  • 提供多行评论

开发人员:嗯......我知道,每当我找到/*时,我都会评论所有内容,直到下一个*/ - 简单!

MyLang版本1发布

1天后......

用户:呃......我不能做递归评论,帮助我。

支持:请等待。

30分钟后......

支持经理 - &gt;开发人员:用户无法进行递归评论。

开发人员:(什么是递归......)坚持......

30分钟后

开发人员:是的,我们不支持递归评论。