Должны ли комментарии Паскаля вкладываться? - PullRequest
8 голосов
/ 01 октября 2010

У меня есть вопрос по домашнему заданию компилятора, в котором я хочу нарисовать DFA для комментариев на Паскале, но я никогда (и, вероятно, никогда не буду) использовать Паскаль.Вопрос не указывает, должны ли мы использовать ANSI Pascal или Turbo Pascal, поэтому я собирался сделать одно для обоих.

Некоторые поиски в Google показали, что Turbo Pascal допускает вложенные комментарии, если один и тот же разделитель неиспользуется, поэтому {(*comment*)} в порядке и (*{comment}*), но {{comment}} или (*(*comment*)*) не в порядке.Мой вопрос здесь, если комментарий типа {(*{comment}*)} или (*{(*comment*)}*) в порядке, так как те же разделители не используются в строке.

Я также погуглил, чтобы увидеть, разрешил ли ANSI Pascal вложенные комментарии, но я ненашел окончательный ответ.Если ANSI Pascal разрешает вложенные комментарии, каковы правила?

Кстати, меня не беспокоит странное соглашение о комментировании различных начальных и конечных разделителей, соглашение, которое разрешено в ANSI Pascal.

ОБНОВЛЕНИЕ:

Я хотел бы пояснить, что меня не особо интересует, как конкретные компиляторы обрабатывают комментарии на Паскале, меня интересует, как компилятору СЛЕДУЕТ обрабатывать комментарии Pascal, если этот компилятор полностью соответствует стандартам ANSI или TURBO Pascal.

Ответы [ 4 ]

11 голосов
/ 02 октября 2010

ISO 7185: 1990 говорит об комментариях в §6.1.8:

Где комментарий должен быть любой последовательностью символов и разделениемстрок, не содержащих ни}, ни *), конструкция

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

должна быть comment , если ни {, ни (* не встречаются в символьной строке или в комментарии.

ПРИМЕЧАНИЯ

  1. Таким образом, комментарий может начинаться с { и заканчиватьсяс *) или начинаются с (* и заканчиваются }.
  2. Последовательность (*) не может встречаться в комментарии, даже если последовательность {) может.

В соответствии с этим, по сути, есть только один вид комментариев. Хотя вы можете начать комментарий с { или (*, вы не можете использовать разные наборы символов для «обтекания» других комментариев.Паскаль, с другой стороны, имеет два вида комментариев: те, которые используют скобки и те, которые используют скобки.

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 не может принимать произвольно вложенные конструкции.

2 голосов
/ 01 октября 2010

По крайней мере Delphi не допустит {(*{comment}*)}, потому что первая закрывающая фигурная скобка закроет первую открывающуюся фигурную скобку, а не последнюю.То же относится и к вашему другому образцу.

0 голосов
/ 25 декабря 2014

в фпк (бесплатный паскаль): // ... ( ... ) {...}

0 голосов
/ 02 октября 2010

Я думаю, что в версии Turbo Pascal, которую я использовал, вложенные комментарии не поддерживаются, оба из них будут скомпилированы:

{(* }

{{ }

Некоторые поиски в Google показали, что Turbo Pascal допускает вложенные комментарии какдо тех пор, пока тот же разделитель не используется

По сути, вложенные комментарии «поддерживаются», поскольку компилятор игнорирует альтернативный синтаксис.

Вы можете скачать паскаль-компилятор и написать свой dfa для поддержки того, что поддерживает этот компилятор.Используйте одну из примеров программ и посмотрите, скомпилируются ли вложенные комментарии.

...