gpt4 book ai didi

comments - Pascal 注释是否应该嵌套?

转载 作者:行者123 更新时间:2023-12-04 05:58:51 26 4
gpt4 key购买 nike

我有一个编译器作业问题,希望我为 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 注释。

最佳答案

ISO 7185:1990关于 §6.1.8 中的评论是这样说的:

Where a commentary shall be any sequence of characters and separations of lines, containing neither } nor *), the construct

( '{' | '(*' ) commentary ( '*)' | '}' )

shall be a comment if neither the { nor the (* occurs within a character-string or within a commentary.

NOTES

  1. A comment may thus commence with { and end with *), or commence with (* and end with }.
  2. The sequence (*) cannot occur in a commentary even though the sequence {) can.


据此,基本上只有一种评论。虽然你可以用 { 开始评论或 (* ,您不能使用不同的字符集来“包装”其他注释。另一方面,Turbo Pascal 有两种注释,使用大括号的注释和使用圆括号的注释。

如果您有大括号样式的注释并将其括在括号样式的注释中以创建 (*{}*) , ISO 说注释是 (*{}*)剩下的,这将是您代码中的语法错误,而 Turbo Pascal 说注释是 (*{}*)没有留下任何文字。

这两种风格都不允许您将已包装的注释包装在另一组注释分隔符中。那是因为一旦你包装了评论,“内部”评论就不再被视为评论。这只是普通的文字。如果您有 {(**)}并且您想将其包装在括号样式的注释中以生成 (*{(**)}*) , ISO 和 Turbo Pascal 都说评论是 (*{(**)}*)剩下的。

在 fpc 和 objfpc 模式下,Free Pascal 支持嵌套注释,因此我最近的示例将被接受为没有剩余文本的有效注释。 The FPC documentation on the matter但实际上并没有证明这一点。它给出了六个所谓的嵌套注释示例:

{ 评论 1 (* 评论 2 *) }
(* 评论 1 { 评论 2 } *)
{ 评论 1//评论 2 }
(* 评论 1//评论 2 *)
//注释 1 (* 注释 2 *)
//评论 1 { 评论 2 }

但是我们已经确定的 Turbo Pascal(或 Delphi,对于最后两行)不支持嵌套,将接受所有这些作为完全有效的注释! FPC 确实支持嵌套注释,但这些示例并没有说明。以下是嵌套注释的一些示例:

{ 评论 1 { 评论 2 } }
(* 评论 1 (* 评论 2 *) *)
{ 评论 1 (* 评论 2 { 评论 3 } *) }

我什至认为 FPC 的第三个和第四个例子实际上是对 FPC 支持嵌套注释的主张的反例。这两行根本不应该是完整的注释。 //在行的中间引入了直到行尾 (EOL) 才终止的注释。 EOL 出现在 } 之后和 *) ,所以当我们到达大括号或括号分隔符时,内部的斜线样式的注释不可能终止。正如 <a> <b> </a> </b>是不正确嵌套的 XML,我们有不正确嵌套的注释: { // } EOL .

经过进一步的实验,我得出结论,在 FPC 中,只能嵌套相同类型的注释。例如,一旦您使用 { 打开评论, (*人物不再特别。 FPC 不会在大括号样式注释内打开括号样式注释。如果是这样,那么 {(*}由于未终止的括号注释,这将是一个语法错误。我们可以通过说当评论异类时终止内部评论是可选的来解释这一点,但更简单的解释是说内部评论根本没有被检测为评论。打开大括号样式的注释后,只有大括号才有意义。此外, //当它在大括号内时,它实际上并不开始斜线样式的注释。这是一个更简单的解释,即 FPC 允许不正确地嵌套斜线样式的注释。您可以说斜线样式的注释根本不嵌套,或者嵌套在其他斜线样式的注释中的斜线样式的注释共享一个 EOL 终止符。

您的作业可能意味着您使用 Turbo Pascal 样式,其中注释分隔符必须匹配。它绝对没想到你会使用 Free Pascal 风格,因为它会使任务无法完成——DFA 不能接受任意嵌套的构造。

关于comments - Pascal 注释是否应该嵌套?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3842443/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com