Вот скажите мне, убогому, почему в C++ запрещены вложенные коменты вида /* */?
Есть этому хоть какое-то разумное объяснение? На мой взгляд — ни малейшего. Чистый идиотизм. Я помню в Turbo-C было можно. Даже в PL/I было можно, хотя компилятор выдавал предупреждения. Кстати, в этих ваших C# и Java — можно?
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Здравствуйте, McSeem2, Вы писали:
MS>Вот скажите мне, убогому, почему в C++ запрещены вложенные коменты вида /* */? MS>Есть этому хоть какое-то разумное объяснение? На мой взгляд — ни малейшего. Чистый идиотизм. Я помню в Turbo-C было можно. Даже в PL/I было можно, хотя компилятор выдавал предупреждения. Кстати, в этих ваших C# и Java — можно?
Вложенные куда? Давай пример
Здравствуйте, McSeem2, Вы писали:
MS>Вот скажите мне, убогому, почему в C++ запрещены вложенные коменты вида /* */? MS>Есть этому хоть какое-то разумное объяснение? На мой взгляд — ни малейшего. Чистый идиотизм. Я помню в Turbo-C было можно. Даже в PL/I было можно, хотя компилятор выдавал предупреждения. Кстати, в этих ваших C# и Java — можно?
Потому что кто-нибудь обязательно воспользуется этим и понапишет вложенных на полсотни уровней комментов, потом сиди разгребай...
Здравствуйте, DTB, Вы писали:
DTB>/* begin /*cmt1*/ end */
Ааа. Тогда в C# точно также.
DTB>кстати порой действительно вымораживает, приходится блок комментить //
Я чего-то вообще не использую /* */. Давно уже приноровился в Студии жать Ctrl+K, C.
Здравствуйте, okman, Вы писали:
O>Потому что кто-нибудь обязательно воспользуется этим и понапишет вложенных на полсотни уровней комментов, потом сиди разгребай...
Их можно было бы подсвечивать разными цветами. ИМХО, для современных IDE это совсем несложно. Скажем, четная вложенность и нечетная — разными цветами, или цвет фона разный. Или завести, скажем, отдельные градации для 8 уровней вложенности.
Здравствуйте, MxMsk, Вы писали:
DTB>>кстати порой действительно вымораживает, приходится блок комментить // MM>Я чего-то вообще не использую /* */. Давно уже приноровился в Студии жать Ctrl+K, C.
Здравствуйте, McSeem2, Вы писали:
MS>Вот скажите мне, убогому, почему в C++ запрещены вложенные коменты вида /* */?
Причина простая.
Вложенные комментарии это контескстно свободный язык.
Если запретить вложенность то получаем регулярный язык который можно разбирать простым конечным автоматом.
Классический способ разбора текста это разделение разбора на 2 уровня лексер и парсер.
Лексер разбирает регулярное надмножество языка. И реализуется очень эффективным конечным автоматом.
Парсер разбирает контекстно свободное надмножество языка. Тут все сложнее. Но есть несколько техник для эффективного разбора некоторого подмножества контекстно свободных грамматик. Их проблема в том что они работают только на потоке токенов которые выдает лексер. На потоке символов они просто не смогут работать. Ибо у них очень сильно ограничена возможность по заглядыванию вперед.
Собственно в расчете на эту схему языки и проектируют. Эта схема даже в стандартах языков видна.
Можно построить безлексерный парсер. Проблема в том что эти алгоритмы идут в разрез со всеми догмами классического компиляторостроения и как следствие почти не исследованы. Все приходится изобретать на ходу.
Я сейчас работаю над таким построителем парсеров.
На то что получается можно посмотреть тут http://code.google.com/p/nemerle/source/browse/nemerle/trunk/snippets/peg-parser/
В качестве основы взят PEG но от классического PEG'а он со временем уйдет
Здравствуйте, Muxa, Вы писали:
M>прочитал тему, и возник вопрос: M>а что, все кроме меня понимают необходимость наличия возможности пользоваться вложенными комментариями?
Это очень удобно для того чтобы закомментировать кусок кода в котором уже есть комментарии.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, WolfHound, Вы писали:
WH>Здравствуйте, Muxa, Вы писали:
M>>прочитал тему, и возник вопрос: M>>а что, все кроме меня понимают необходимость наличия возможности пользоваться вложенными комментариями? WH>Это очень удобно для того чтобы закомментировать кусок кода в котором уже есть комментарии.
Hotkeys не помогают?
Я, конечно, понимаю, что нужно сделать больше движений, но...
Здравствуйте, 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();
}
}
подправить его с учетом вложенности не такая уж большая проблема
Здравствуйте, McSeem2, Вы писали:
MS>Вот скажите мне, убогому, почему в C++ запрещены вложенные коменты вида /* */? MS>Есть этому хоть какое-то разумное объяснение? На мой взгляд — ни малейшего. Чистый идиотизм. Я помню в Turbo-C было можно. Даже в PL/I было можно, хотя компилятор выдавал предупреждения. Кстати, в этих ваших C# и Java — можно?
А нахрена, собственно? Я и сами-то комментарии /* */ использую раз в пятилетку, и то, когда нужно временно закомментить что-то в одной строке — довольно редки use-case.
Новости очень смешные. Зря вы не смотрите. Как будто за наркоманами подсматриваешь. Только тетка с погодой в завязке.
There is no such thing as a winnable war.
Здравствуйте, Eugeny__, Вы писали:
E__>А нахрена, собственно? Я и сами-то комментарии /* */ использую раз в пятилетку, и то, когда нужно временно закомментить что-то в одной строке — довольно редки use-case.
Я очень много экспериментирую с кодом, соответственно часто приходится копи-пастить и коментить большие куски. Я согласен, что для продакшена эти вложенные коменты нафиг не уперлись, но для экпериментов — напрягает.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Здравствуйте, WolfHound, Вы писали:
MS>>Вот скажите мне, убогому, почему в C++ запрещены вложенные коменты вида /* */? WH>Причина простая. WH>Вложенные комментарии это контескстно свободный язык. WH>Если запретить вложенность то получаем регулярный язык который можно разбирать простым конечным автоматом.
Я верю тебе как родному, но скажи пожалуйста, чем принципиально отличается конструкция /* */ от { }? Только тем, что там два символа?
Ну и потом, современные языки, старше Си, принципиально не позволяют пользоваться потоковым конечным автоматом, хотя бы потому, что допускают ссылки вперед внутри классов.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Здравствуйте, McSeem2, Вы писали:
MS>Я верю тебе как родному, но скажи пожалуйста, чем принципиально отличается конструкция /* */ от { }? Только тем, что там два символа? MS>Ну и потом, современные языки, старше Си, принципиально не позволяют пользоваться потоковым конечным автоматом, хотя бы потому, что допускают ссылки вперед внутри классов.
Я вроде все объяснил. Ну ладно попробую еще раз.
Класические компиляторы работают грубо говоря в 4 этапа:
1)Разбор текста на токены. На это этапе отбрасываются пробелы и коментарии.
Тут все разбирается ужасно эффективными конечными автоматами.
2)Разбор контекстно свободного надмножества языка.
Тут кучу вариантов LL(1), LL(k), LL(*), LR(0), LR(1), LALR, GLR,... и еще куча алгоритмов для разбора контекстно свободных язаков.
На этом этапе обрабатываются {}.
Коментарии до сюда не доходят.
3)Поиск имен, типизация, разрешение перегрузки,...
Тут некий рукопашный код.
Именно тут обрабатываются ссылки вперед.
Никакого текста на этом этапе уже нет.
Здравствуйте, WolfHound, Вы писали:
M>>а что, все кроме меня понимают необходимость наличия возможности пользоваться вложенными комментариями? WH>Это очень удобно для того чтобы закомментировать кусок кода в котором уже есть комментарии.
В наше прогрессивное время этот кусок кода уже можно тупо удалять. А потом сделать git checkout имяфайла или, если файл уже закоммичен, откатить тот коммит, которым этот блок удалён.
WH>Классический способ разбора текста это разделение разбора на 2 уровня лексер и парсер.
Ты забыл, что речь идет о С++. Там прежде чем лексер с парсером запустить, должно препроцессирование выполниться. И в принципе во время препроцессирования убрать все комментарии вполне можно. Даже вложенные. Кстати, Borland C++ для DOS это умел. Так что ИМХО причины не в этом.