我有一个编译器作业问题,希望我为Pascal评论绘制DFA,但我从未(也可能永远不会)使用Pascal。问题没有说明我们是否应该使用ANSI Pascal或Turbo Pascal,所以我打算为两者做一个。
一些Google搜索向我显示Turbo Pascal允许嵌套注释,只要未使用相同的分隔符,因此{(*comment*)}
即可,(*{comment}*)
也是如此,{{comment}}
或{{(*(*comment*)*)
1}}不行。我的问题是,如果{(*{comment}*)}
或(*{(*comment*)}*)
之类的评论没有问题,因为连续使用相同的分隔符。
我也用谷歌搜索ANSI Pascal是否允许嵌套注释,但我还没有找到明确的答案。如果ANSI Pascal允许嵌套注释,那么规则是什么?
另外,我并不担心不同的起始和结束分隔符的奇怪的注释约定,这是ANSI Pascal中允许的约定。
更新
我想明确一点,我并不关心特定编译器如何处理Pascal注释,我关心编译器应该如何处理Pascal注释,如果编译器100%遵守ANSI或TURBO Pascal标准。
答案 0 :(得分:11)
ISO 7185:1990说的是关于§6.1.8中的评论:
评论应该是任何字符序列和行的分隔,既不包含}也不包含*),构造
('{'|'(*')评论('*)'|'}')
如果{和<*出现在字符串或评论中,则注释。
注意
- 评论可以从
{
开始,以*)
结束,或以(*
开头,以}
结束。- 即使序列
醇>(*)
可以,序列{)
也不会出现在评论中。
据此,基本上只有一种评论。虽然您可以使用{
或(*
开始评论,但您不能使用不同的字符集来“包装”其他评论。另一方面,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)之前不会终止。在<{em> *)
和<a> <b> </a> </b>
之后,EOL来,因此当我们到达括号或括号分隔符时,内部的斜杠式注释不可能终止。就像{ // } EOL
嵌套XML不正确一样,我们有不正确的嵌套注释:{
。
经过进一步的实验,我得出结论,在FPC中,只有相同类型的注释。例如,一旦您使用(*
打开评论,{(*}
字符就不再是特殊字符。 FPC不会在大括号样式注释中打开括号样式的注释。如果确实如此,那么由于未终止的括号注释,//
将是语法错误。我们可以通过说当评论是异构的时候终止内部评论是可选的来解释这一点,但是说内部评论根本没有被检测为评论是一个更简单的解释。一旦你打开括号式评论,只有大括号有意义。此外,{{1}}实际上并没有在括号内开始斜杠式注释。这是一个更简单的解释,说FPC允许斜杠式注释不正确地嵌套。您可以说斜杠样式的注释根本不会嵌套,或者斜杠样式的注释嵌套在其他斜杠样式的注释中共享单个EOL终止符。
您的作业可能意味着您使用Turbo Pascal样式,评论分隔符必须匹配。它肯定不会指望你使用Free Pascal样式,因为它会使作业无法完成 - DFA不能接受任意嵌套的结构。
答案 1 :(得分:2)
至少Delphi不允许{(*{comment}*)}
因为第一个结束花括号将关闭第一个开口花括号而不是最后一个。同样适用于您的其他样本。
答案 2 :(得分:0)
我认为在我使用的turbo pascal版本中,不支持嵌套注释,这两种注释都会编译:
{(* }
{{ }
一些Google搜索向我显示Turbo Pascal允许嵌套注释,只要不使用相同的分隔符
实际上,嵌套注释是“受支持的”,因为编译器会忽略替代语法。
你可以download a pascal compiler编写你的dfa以支持编译器支持的内容。使用他们的一个示例程序,看看嵌套的注释是否会编译。
答案 3 :(得分:0)
在fpc(免费pascal)中: // ... ( ... 的) {...}