Вложенные коменты в C++
От: McSeem2 США http://www.antigrain.com
Дата: 04.10.10 02:47
Оценка: +1 -1 :)
Вот скажите мне, убогому, почему в C++ запрещены вложенные коменты вида /* */?
Есть этому хоть какое-то разумное объяснение? На мой взгляд — ни малейшего. Чистый идиотизм. Я помню в Turbo-C было можно. Даже в PL/I было можно, хотя компилятор выдавал предупреждения. Кстати, в этих ваших C# и Java — можно?
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Re: Вложенные коменты в C++
От: MxMsk Португалия  
Дата: 04.10.10 06:32
Оценка:
Здравствуйте, McSeem2, Вы писали:

MS>Вот скажите мне, убогому, почему в C++ запрещены вложенные коменты вида /* */?

MS>Есть этому хоть какое-то разумное объяснение? На мой взгляд — ни малейшего. Чистый идиотизм. Я помню в Turbo-C было можно. Даже в PL/I было можно, хотя компилятор выдавал предупреждения. Кстати, в этих ваших C# и Java — можно?
Вложенные куда? Давай пример
Re[2]: Вложенные коменты в C++
От: DTB Россия  
Дата: 04.10.10 06:50
Оценка:
Здравствуйте, MxMsk, Вы писали:

MM>Вложенные куда? Давай пример


прозреваю что, что-то типа

/* begin /*cmt1*/ end */


кстати порой действительно вымораживает, приходится блок комментить //
Have fun...
Re: Вложенные коменты в C++
От: okman Беларусь https://searchinform.ru/
Дата: 04.10.10 07:01
Оценка:
Здравствуйте, McSeem2, Вы писали:

MS>Вот скажите мне, убогому, почему в C++ запрещены вложенные коменты вида /* */?

MS>Есть этому хоть какое-то разумное объяснение? На мой взгляд — ни малейшего. Чистый идиотизм. Я помню в Turbo-C было можно. Даже в PL/I было можно, хотя компилятор выдавал предупреждения. Кстати, в этих ваших C# и Java — можно?

Потому что кто-нибудь обязательно воспользуется этим и понапишет вложенных на полсотни уровней комментов, потом сиди разгребай...
Re[3]: Вложенные коменты в C++
От: MxMsk Португалия  
Дата: 04.10.10 07:10
Оценка:
Здравствуйте, DTB, Вы писали:

DTB>/* begin /*cmt1*/ end */

Ааа. Тогда в C# точно также.

DTB>кстати порой действительно вымораживает, приходится блок комментить //

Я чего-то вообще не использую /* */. Давно уже приноровился в Студии жать Ctrl+K, C.
Re: Вложенные коменты в C++
От: Nuzhny Россия https://github.com/Nuzhny007
Дата: 04.10.10 07:34
Оценка:
Здравствуйте, McSeem2, Вы писали:

MS>Вот скажите мне, убогому, почему в C++ запрещены вложенные коменты вида /* */?


Для больших блоков самое удобное — это #if 0 ... #endif
Плюс можно поставить #else для альтернативного куска кода.
Re[2]: Вложенные коменты в C++
От: x-code  
Дата: 04.10.10 08:07
Оценка: -1
Здравствуйте, okman, Вы писали:

O>Потому что кто-нибудь обязательно воспользуется этим и понапишет вложенных на полсотни уровней комментов, потом сиди разгребай...


Их можно было бы подсвечивать разными цветами. ИМХО, для современных IDE это совсем несложно. Скажем, четная вложенность и нечетная — разными цветами, или цвет фона разный. Или завести, скажем, отдельные градации для 8 уровней вложенности.
Re: Вложенные коменты в C++
От: Alexey931  
Дата: 04.10.10 08:29
Оценка: 5 (4) +1
Здравствуйте, McSeem2, Вы писали:

MS>Вот скажите мне, убогому, почему в C++ запрещены вложенные коменты вида /* */?


Каменты вида /* */ вообще оставлены только для совместимости с C. Они и там были сделаны не подумавши:

{
int a, b, *c;
...
a = b/*c; // Смысл выражения неприятно зависит от наличия или отсутствия пробела между / и *
}
Re[4]: Вложенные коменты в C++
От: iGrog Финляндия  
Дата: 04.10.10 08:34
Оценка:
Здравствуйте, MxMsk, Вы писали:

DTB>>кстати порой действительно вымораживает, приходится блок комментить //

MM>Я чего-то вообще не использую /* */. Давно уже приноровился в Студии жать Ctrl+K, C.

Еще и Ctrl+/ есть
Re: Вложенные коменты в C++
От: WolfHound  
Дата: 04.10.10 09:45
Оценка: 2 (2) +2
Здравствуйте, McSeem2, Вы писали:

MS>Вот скажите мне, убогому, почему в C++ запрещены вложенные коменты вида /* */?

Причина простая.
Вложенные комментарии это контескстно свободный язык.
Если запретить вложенность то получаем регулярный язык который можно разбирать простым конечным автоматом.

Классический способ разбора текста это разделение разбора на 2 уровня лексер и парсер.
Лексер разбирает регулярное надмножество языка. И реализуется очень эффективным конечным автоматом.
Парсер разбирает контекстно свободное надмножество языка. Тут все сложнее. Но есть несколько техник для эффективного разбора некоторого подмножества контекстно свободных грамматик. Их проблема в том что они работают только на потоке токенов которые выдает лексер. На потоке символов они просто не смогут работать. Ибо у них очень сильно ограничена возможность по заглядыванию вперед.

Собственно в расчете на эту схему языки и проектируют. Эта схема даже в стандартах языков видна.

Можно построить безлексерный парсер. Проблема в том что эти алгоритмы идут в разрез со всеми догмами классического компиляторостроения и как следствие почти не исследованы. Все приходится изобретать на ходу.
Я сейчас работаю над таким построителем парсеров.
На то что получается можно посмотреть тут http://code.google.com/p/nemerle/source/browse/nemerle/trunk/snippets/peg-parser/
В качестве основы взят PEG но от классического PEG'а он со временем уйдет
Автор: WolfHound
Дата: 28.09.10
довольно сильно. Алгоритм разбора уже довольно сильно отличается от пакрата.

Сейчас в парсере C# написанном при помощи этого построителя парсеров комментарии задаются так
      singleLineComment = "//" (!newLineCharacter any)*;
      delimitedComment = "/*" (!"*/" any)* "*/";
      comment = singleLineComment / delimitedComment;

Для того чтобы сделать вложенные комментарии достаточно сделать так
      delimitedComment = "/*" (delimitedComment / any)* "*/";
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re: Вложенные коменты в C++
От: Muxa  
Дата: 04.10.10 09:57
Оценка: +1
прочитал тему, и возник вопрос:
а что, все кроме меня понимают необходимость наличия возможности пользоваться вложенными комментариями?
Re[2]: Вложенные коменты в C++
От: WolfHound  
Дата: 04.10.10 10:24
Оценка: +2
Здравствуйте, Muxa, Вы писали:

M>прочитал тему, и возник вопрос:

M>а что, все кроме меня понимают необходимость наличия возможности пользоваться вложенными комментариями?
Это очень удобно для того чтобы закомментировать кусок кода в котором уже есть комментарии.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[3]: Вложенные коменты в C++
От: blackhearted Украина  
Дата: 04.10.10 11:06
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, Muxa, Вы писали:


M>>прочитал тему, и возник вопрос:

M>>а что, все кроме меня понимают необходимость наличия возможности пользоваться вложенными комментариями?
WH>Это очень удобно для того чтобы закомментировать кусок кода в котором уже есть комментарии.

Hotkeys не помогают?
Я, конечно, понимаю, что нужно сделать больше движений, но...
Re[2]: Вложенные коменты в C++
От: Mystic Украина http://mystic2000.newmail.ru
Дата: 04.10.10 11:19
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, McSeem2, Вы писали:


MS>>Вот скажите мне, убогому, почему в C++ запрещены вложенные коменты вида /* */?


WH>Причина простая.

WH>Вложенные комментарии это контескстно свободный язык.
WH>Если запретить вложенность то получаем регулярный язык который можно разбирать простым конечным автоматом.

Часто комментарий /* */ обрабатывается циклом По крайней мере всякие минимальные вхождения появились относительно недавно, раньше везде жил цикл (пример для паскаля)

"(*"   |
"{"    { register int c;
     while ((c = input()))
     {
      if (c == '}')
       break;
      else if (c == '*')
      {
       if ((c = input()) == ')')
        break;
       else
        unput (c);
      }
      else if (c == '\n')
       line_no++;
      else if (c == 0)
       commenteof();
     }
    }


подправить его с учетом вложенности не такая уж большая проблема
Re: Вложенные коменты в C++
От: Eugeny__ Украина  
Дата: 04.10.10 11:52
Оценка:
Здравствуйте, McSeem2, Вы писали:

MS>Вот скажите мне, убогому, почему в C++ запрещены вложенные коменты вида /* */?

MS>Есть этому хоть какое-то разумное объяснение? На мой взгляд — ни малейшего. Чистый идиотизм. Я помню в Turbo-C было можно. Даже в PL/I было можно, хотя компилятор выдавал предупреждения. Кстати, в этих ваших C# и Java — можно?

А нахрена, собственно? Я и сами-то комментарии /* */ использую раз в пятилетку, и то, когда нужно временно закомментить что-то в одной строке — довольно редки use-case.
Новости очень смешные. Зря вы не смотрите. Как будто за наркоманами подсматриваешь. Только тетка с погодой в завязке.
There is no such thing as a winnable war.
Re[2]: Вложенные коменты в C++
От: McSeem2 США http://www.antigrain.com
Дата: 04.10.10 15:45
Оценка:
Здравствуйте, Eugeny__, Вы писали:

E__>А нахрена, собственно? Я и сами-то комментарии /* */ использую раз в пятилетку, и то, когда нужно временно закомментить что-то в одной строке — довольно редки use-case.


Я очень много экспериментирую с кодом, соответственно часто приходится копи-пастить и коментить большие куски. Я согласен, что для продакшена эти вложенные коменты нафиг не уперлись, но для экпериментов — напрягает.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Re[2]: Вложенные коменты в C++
От: McSeem2 США http://www.antigrain.com
Дата: 04.10.10 15:50
Оценка:
Здравствуйте, WolfHound, Вы писали:

MS>>Вот скажите мне, убогому, почему в C++ запрещены вложенные коменты вида /* */?

WH>Причина простая.
WH>Вложенные комментарии это контескстно свободный язык.
WH>Если запретить вложенность то получаем регулярный язык который можно разбирать простым конечным автоматом.

Я верю тебе как родному, но скажи пожалуйста, чем принципиально отличается конструкция /* */ от { }? Только тем, что там два символа?
Ну и потом, современные языки, старше Си, принципиально не позволяют пользоваться потоковым конечным автоматом, хотя бы потому, что допускают ссылки вперед внутри классов.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Re[3]: Вложенные коменты в C++
От: WolfHound  
Дата: 04.10.10 16:18
Оценка:
Здравствуйте, McSeem2, Вы писали:

MS>Я верю тебе как родному, но скажи пожалуйста, чем принципиально отличается конструкция /* */ от { }? Только тем, что там два символа?

MS>Ну и потом, современные языки, старше Си, принципиально не позволяют пользоваться потоковым конечным автоматом, хотя бы потому, что допускают ссылки вперед внутри классов.
Я вроде все объяснил. Ну ладно попробую еще раз.

Класические компиляторы работают грубо говоря в 4 этапа:
1)Разбор текста на токены. На это этапе отбрасываются пробелы и коментарии.
Тут все разбирается ужасно эффективными конечными автоматами.

2)Разбор контекстно свободного надмножества языка.
Тут кучу вариантов LL(1), LL(k), LL(*), LR(0), LR(1), LALR, GLR,... и еще куча алгоритмов для разбора контекстно свободных язаков.
На этом этапе обрабатываются {}.
Коментарии до сюда не доходят.

3)Поиск имен, типизация, разрешение перегрузки,...
Тут некий рукопашный код.
Именно тут обрабатываются ссылки вперед.
Никакого текста на этом этапе уже нет.

4)Кодогенерация.

Проблема с комментариями возникает из-за того что разбор текста разбит на два этапа.
Почему это так и как с этим бороться.
Автор: WolfHound
Дата: 04.10.10
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[3]: Вложенные коменты в C++
От: Centaur Россия  
Дата: 04.10.10 16:20
Оценка: +1
Здравствуйте, WolfHound, Вы писали:

M>>а что, все кроме меня понимают необходимость наличия возможности пользоваться вложенными комментариями?

WH>Это очень удобно для того чтобы закомментировать кусок кода в котором уже есть комментарии.
В наше прогрессивное время этот кусок кода уже можно тупо удалять. А потом сделать git checkout имяфайла или, если файл уже закоммичен, откатить тот коммит, которым этот блок удалён.
Re[2]: Вложенные коменты в C++
От: Pavel Dvorkin Россия  
Дата: 04.10.10 16:53
Оценка:
Здравствуйте, WolfHound, Вы писали:


WH>Классический способ разбора текста это разделение разбора на 2 уровня лексер и парсер.


Ты забыл, что речь идет о С++. Там прежде чем лексер с парсером запустить, должно препроцессирование выполниться. И в принципе во время препроцессирования убрать все комментарии вполне можно. Даже вложенные. Кстати, Borland C++ для DOS это умел. Так что ИМХО причины не в этом.
With best regards
Pavel Dvorkin
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.