ISO 7185: 1990 говорит об комментариях в §6.1.8:
Где комментарий должен быть любой последовательностью символов и разделениемстрок, не содержащих ни}, ни *), конструкция
('{' | '(*') commentary ('*)' | '}')
должна быть comment , если ни {, ни (* не встречаются в символьной строке или в комментарии.
ПРИМЕЧАНИЯ
- Таким образом, комментарий может начинаться с
{
и заканчиватьсяс *)
или начинаются с (*
и заканчиваются }
. - Последовательность
(*)
не может встречаться в комментарии, даже если последовательность {)
может.
В соответствии с этим, по сути, есть только один вид комментариев. Хотя вы можете начать комментарий с {
или (*
, вы не можете использовать разные наборы символов для «обтекания» других комментариев.Паскаль, с другой стороны, имеет два вида комментариев: те, которые используют скобки и те, которые используют скобки.
IЕсли у вас есть комментарий в стиле фигурных скобок и он заключен в комментарий в скобках для создания (*{}*)
, ISO говорит, что комментарий - (*{}
с оставшимся *)
, что будет синтаксической ошибкой в вашем коде, тогда как TurboПаскаль говорит, что комментарий (*{}*)
без текста.
Ни один из стилей не позволяет вам обернуть уже завернутый комментарий в еще один набор разделителей комментариев.Это связано с тем, что после переноса комментария «внутренний» комментарий перестает рассматриваться как комментарий.Это просто обычный текст.Если у вас есть {(**)}
, и вы хотите заключить его в комментарий в скобках, чтобы (*{(**)}*)
, ISO и Turbo Pascal оба сказали, что комментарий (*{(**)
с }*)
оставленным.
InВ режимах fpc и objfpc Free Pascal поддерживает вложенные комментарии, поэтому мой последний пример будет принят как действительный комментарий без остатка текста. Документация FPC по этому вопросу на самом деле этого не демонстрирует.Он приводит шесть примеров предположительно вложенных комментариев:
{ 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 только комментарии того же типа вложены.Например, когда вы открываете комментарий с помощью {
, символы (*
перестают быть специальными.FPC не будет открывать комментарий в скобках в комментариях в скобках.Если это так, то {(*}
будет синтаксической ошибкой из-за неопределенного комментария в скобках.Мы могли бы объяснить это, сказав, что завершение внутренних комментариев необязательно, когда комментарии неоднородны, но проще сказать, что внутренний комментарий вообще не определяется как комментарий.После открытия комментария в стиле фигурных скобок значение имеют только фигурные скобки.Кроме того, //
фактически не запускает комментарий в стиле косой черты, когда он находится внутри фигурных скобок.Это более простое объяснение, если сказать, что FPC позволяет неправильно вкладывать комментарии в стиле косой черты.Вы можете сказать, что комментарии в стиле косой черты вообще не вложены, или что комментарии в стиле косой черты вложены в другие комментарии в стиле косой черты поделиться одним терминатором EOL.
Возможно, ваше назначение означало, что вы использовали стиль Turbo Pascal, где разделители комментариев должны совпадать.Он определенно не ожидал, что вы будете использовать стиль Free Pascal, поскольку это сделало бы невозможным выполнение назначения - DFA не может принимать произвольно вложенные конструкции.