代码之家  ›  专栏  ›  技术社区  ›  ubiquibacon

帕斯卡的评论应该嵌套吗?

  •  8
  • ubiquibacon  · 技术社区  · 15 年前

    我有一个编译器家庭作业问题,希望我为Pascal注释绘制一个DFA,但我从未(也可能永远不会)使用Pascal。这个问题没有具体说明我们应该使用ansi-pascal还是turbo-pascal,所以我打算两者都使用一个。

    一些谷歌搜索显示,只要不使用相同的分隔符,turbo pascal就允许嵌套注释,所以 {(*comment*)} 还好,就是这样 (*{comment}*) 但是 {{comment}} (*(*comment*)*) 不好。我的问题是 {(*{comment}*)} (*{(*comment*)}*) 因为行中没有使用相同的分隔符,所以可以。

    我也在谷歌上搜索了一下,看看ansi-pascal是否允许嵌套注释,但我没有找到一个明确的答案。如果ansi pascal允许嵌套注释,那么规则是什么?

    另一方面,我不担心不同的开始和结束定界符的奇怪的注释约定,这是在ansi pascal中允许的约定。

    更新:

    我想澄清一下,我并不真正关心特定的编译器如何处理Pascal注释,而是关心编译器如何处理 应该 如果编译器100%遵守ANSI或turbo pascal标准,则处理pascal注释。

    4 回复  |  直到 9 年前
        1
  •  11
  •   Rob Kennedy    15 年前

    ISO 7185:1990 关于第6.1.8节中的评论:

    在哪里 评论 应为任何字符序列和行分隔符,不包含或*),结构

    ('''(*')评注('*)''')

    应该是 评论 如果和(*都不出现在字符串或注释中。

    笔记

    1. 因此,评论可以从 { 并结束 *) 或从 (* 并结束 } .
    2. 序列 (*) 即使序列 {) 罐头。

    根据这一点,基本上只有一种评论。尽管你可以用以下两种方式开始评论 { (*) 不能使用不同的字符集“包装”其他注释。另一方面,turbo pascal有两种注释,即使用大括号的注释和使用圆括号的注释。

    如果您有大括号样式的注释并将其括在括号样式的注释中以创建 (*{}*) ,iso说评论是 (*{} 具有 *) 剩下的,这将是代码中的语法错误,而turbo pascal说注释是 (*{}*) 没有剩余的文本。

    这两种样式都不允许在另一组注释分隔符中包装已包装的注释。这是因为一旦你包装了一条评论,“内部”的评论就不再被视为评论了。只是普通的文字。如果你有 {(**)} 你想把它放在一个圆括号样式的注释中 (*{(**)}*) ,iso和turbo pascal都表示评论是 (*{(**) 具有 }*) 留下来。

    在fpc和objfpc模式中,free-pascal支持嵌套注释,因此我最近的示例将被接受为一个没有遗留文本的有效注释。 The FPC documentation on the matter 但实际上并不能证明这一点。它给出了六个假设嵌套注释的例子:

    { Comment 1 (* comment 2 *) }  
    (* Comment 1 { comment 2 } *)  
    { comment 1 // Comment 2 }  
    (* comment 1 // Comment 2 *)  
    // comment 1 (* comment 2 *)  
    // comment 1 { comment 2 }
    

    但我们已经建立的turbo pascal(或delphi,用于最后两行) 支持嵌套,将接受 全部的 这些评论是完全正确的!fpc确实支持嵌套注释,但这些示例并不能说明这一点。下面是一些嵌套注释的示例:

    { Comment 1 { comment 2 } }
    (* Comment 1 (* comment 2 *) *)
    { Comment 1 (* comment 2 { comment 3 } *) }
    

    我甚至认为FPC的第三和第四个例子实际上是 反例 对fpc支持嵌套注释的声明。这两行根本不应该是完整的评论。这个 // 在行的中间引入了一个注释,该注释直到行的末尾(eol)才终止。EOL来了 之后 这个 } *) 因此,当到达大括号或圆括号分隔符时,内部斜杠样式的注释不可能终止。正如 <a> <b> </a> </b> 不是正确嵌套的XML,而是错误嵌套的注释: { // } EOL .

    经过进一步的实验,我得出结论,在FPC中,只有评论 同类型的 巢。例如,打开注释时, { , the (*) 字符不再是特殊的。fpc不会在大括号样式注释内打开括号样式注释。如果是这样的话 {(*} 将是由于未终止的括号注释而导致的语法错误。我们可以通过说当注释是异构的时终止内部注释是可选的来解释这一点,但更简单的解释是,根本没有将内部注释检测为注释。打开大括号样式的注释后,只有大括号才有意义。此外, / / 当斜线样式注释位于大括号内时,它实际上不会启动。这是一个简单的解释,可以说fpc允许斜杠样式的注释不正确地嵌套。您可以说斜线样式注释根本不嵌套,也可以说斜线样式注释嵌套在其他斜线样式注释中。 分享 一个单一的EOL终结器。

    您的分配可能是为了使用turbo-pascal样式,其中注释分隔符必须匹配。它绝对不会期望您使用自由帕斯卡风格,因为它会使分配无法完成DFA不能接受任意嵌套结构。

        2
  •  2
  •   Eugene Mayevski 'Callback    15 年前

    至少德尔菲不允许 {(*{comment}*)} 因为第一个右括号将关闭第一个左括号而不是最后一个右括号。同样适用于你的其他样品。

        3
  •  0
  •   Brian Maltzan    15 年前

    我认为在我使用的turbo pascal版本中,不支持嵌套注释,这两种注释都可以编译:

    {(* }
    
    {{ }
    

    一些谷歌搜索显示,只要不使用相同的分隔符,turbo pascal就允许嵌套注释。

    实际上,嵌套注释是“受支持的”,因为编译器忽略了可选语法。

    你可以 download a pascal compiler 并编写您的DFA来支持编译器支持的内容。使用它们的一个示例程序,看看嵌套的注释是否会编译。

        4
  •  0
  •   shs.pas    11 年前

    在fpc(free pascal)中: /… ( ) {…}

    推荐文章