Языковая поддержка рекурсивных комментариев - PullRequest
3 голосов
/ 24 октября 2011

Большинство языков, с которыми я работал, не поддерживают рекурсивные комментарии.

  1. Есть ли какая-то причина, по которой разработчики языка решили не реализовывать это?
  2. Это так?обманчиво сложный?
  3. Будет ли иметь нежелательные результаты?

Пример рекурсивного комментария:

/*
for (int j = 0; j <= SourceTexture.Height; j += SampleSize)
{
    ...
}

// Comment within comment below:
/*for (int i = 0; i < TextureColour.Length; i++)
{
    ...
}*/


sourceTexture.SetData<Color>(TextureColour);
*/

РЕДАКТИРОВАТЬ: я понимаюаргумент ответов до сих пор (проблемы возникают, когда у вас есть токены комментариев в строках).Однако причина моего замешательства в том, что у вас сейчас есть эта проблема.

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

/*
    char *str = "/* string";
    // Are we now 1 level inside a comment or 2 levels?

*/

printf("Hello world");

/*
    char *str2 = "string */";
*/

Но, на мой взглядэто ничем не отличается от неожиданного результата в приведенном ниже примере:

/*
CODE "*/";
*/

, который также может привести к неожиданному / нежелательному результату.

Итак, хотя это может быть проблемой для рекурсивных комментариев, мойАргумент о том, почему это не причина не делать этого, состоит в том, что это уже проблема для нерекурсивных комментариев.Как программист, я знаю, что компилятор ведет себя так, и я работаю над этим.Я не думаю, что гораздо труднее обойти ту же проблему с помощью рекурсивных комментариев.

Ответы [ 4 ]

2 голосов
/ 24 октября 2011

Есть ли причина, по которой дизайнеры языка предпочли бы не реализовать это?

Это затрудняет реализацию лексического анализа.

Это обманчиво сложно?

ИМХО, нет, но это субъективно.

Будет ли это иметь нежелательные результаты?

Трудно сказать. Вы уже обнаружили, что даже нормальные блочные комментарии могут создавать проблемы:

/* print ("*/");    */

Я знаю 2 языка с комментариями блочных вложений: Haskell и Frege .

2 голосов
/ 24 октября 2011

Я приведу пример, и, возможно, он будет понятнее:

/*
    char *str = "/* string";
    // Are we now 1 level inside a comment or 2 levels?    
*/

printf("Hello world. Will this be printed? Or is it a comment?");

/*
    char *str2 = "string */";
*/

Вы не можете анализировать комментарии внутри комментария, не интерпретируя то, что находится внутри комментария.Но вы не можете интерпретировать то, что находится внутри комментария, потому что это комментарий, поэтому по определению «человеческий текст», а не «язык».

1 голос
/ 24 октября 2011

Хотя многострочные комментарии C не могут быть вложенными, эффект рекурсивных комментариев более или менее может быть достигнут в C с помощью #if 0 ... #endif (и я настоятельно рекомендую использовать его, когда вы хотите отключить блок код, именно по этой причине).

Даже препроцессор C, спроектированный так же глупо, как пост, вполне мог бы обрабатывать вложенные комментарии, точно так же, как он должен был обрабатывать вложенные директивы #if с ложными условиями. Так что это не имеет ничего общего с тем, что трудно определить или проанализировать, поскольку, хотя это делает комментарии более сложными, они все равно будут не более сложными, чем другие действия, выполняемые в предварительной обработке.

Но для использования #if 0 ... #endif требуется, конечно, чтобы в коде, который вы пытаетесь исключить, не было ни одного неповторимого #endif.

Принципиально комментарии не могут быть (а) полностью неструктурированными и (б) рекурсивными. Либо по случайности или преднамеренному выбору, C пошел с (a) - закомментированный текст не должен подчиняться никаким синтаксическим ограничениям, за исключением того, что не содержит последовательность комментария-терминатора (или эквивалент триграфа, такой как *??/<newline>/).

0 голосов
/ 24 октября 2011

Я полагаю, что это просто никогда не рассматривается с самого начала, и оно становится «неважным» дополнением к функции по мере развития.Кроме того, требуется гораздо больше проверок.

Пример сценария ...

MyLang версия 1: Цель

  • Обеспечить многострочностькомментирование

Разработчик: хммм .. Я знаю, каждый раз, когда я нахожу /*, я буду комментировать все до следующей */ - просто!

MyLang версия1 выпуск

1 день спустя ...

Пользователь: эм ... Я не могу сделать рекурсивные комментарии, помогите мне.

Поддержка: Пожалуйста, подождите.

30 минут спустя ...

Служба поддержки -> Разработчик: пользователь не может делать рекурсивные комментарии.

Разработчик: (Что такое рекурсивно ...) зависать ...

30 минут спустя

Разработчик: да, мы не поддерживаем рекурсивное комментирование.

...