Здравствуйте, WolfHound, Вы писали:
WH>Это очень удобно для того чтобы закомментировать кусок кода в котором уже есть комментарии.
Так делать — дурной тон. Читаемости коду оставленые тобой обгрызки непонятно чего не добавят. Не нужно — смело удаляем. То, бесценное творение, что ты хотел закомментировать можно забрать из системы контроля версий.
Здравствуйте, WolfHound, Вы писали:
WH>Здравствуйте, McSeem2, Вы писали:
MS>>Я верю тебе как родному, но скажи пожалуйста, чем принципиально отличается конструкция /* */ от { }? Только тем, что там два символа? MS>>Ну и потом, современные языки, старше Си, принципиально не позволяют пользоваться потоковым конечным автоматом, хотя бы потому, что допускают ссылки вперед внутри классов. WH>Я вроде все объяснил. Ну ладно попробую еще раз.
WH>Класические компиляторы работают грубо говоря в 4 этапа: WH>1)Разбор текста на токены. На это этапе отбрасываются пробелы и коментарии. WH>Тут все разбирается ужасно эффективными конечными автоматами.
Нет никакой проблемы изменить реализацию препроцессора и учесть вложенность комментариев. Задача плёвая.
Здравствуйте, vladimir.vladimirovich, Вы писали:
VV>Так делать — дурной тон. Читаемости коду оставленые тобой обгрызки непонятно чего не добавят. Не нужно — смело удаляем. То, бесценное творение, что ты хотел закомментировать можно забрать из системы контроля версий.
Ой, какие все умные...
Что, ни кто, ни разу не сталкивался с исследовательскими задачами, которые вообще не ясно как решать?
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
MS>>Есть этому хоть какое-то разумное объяснение? На мой взгляд — ни малейшего.
L_L>наверняка, какие-нить кретинские заморочки компиляторов времен "Очакова и покоренья Крыма"
А впрочем, не кретинские, зря я так отцов Наверняка хотели попроще — вот начался коммент и все, скипать все, что внутри, пока не найдем */ и плеваааать на всякие там вложенности
Of course, the code must be complete enough to compile and link.
Здравствуйте, McSeem2, Вы писали:
MS>Вот скажите мне, убогому, почему в C++ запрещены вложенные коменты вида /* */? MS>Есть этому хоть какое-то разумное объяснение? На мой взгляд — ни малейшего. Чистый идиотизм. Я помню в Turbo-C было можно. Даже в PL/I было можно, хотя компилятор выдавал предупреждения. Кстати, в этих ваших C# и Java — можно?
Здравствуйте, McSeem2, Вы писали:
MS>Здравствуйте, Eugeny__, Вы писали:
E__>>А нахрена, собственно? Я и сами-то комментарии /* */ использую раз в пятилетку, и то, когда нужно временно закомментить что-то в одной строке — довольно редки use-case.
MS>Я очень много экспериментирую с кодом, соответственно часто приходится копи-пастить и коментить большие куски. Я согласен, что для продакшена эти вложенные коменты нафиг не уперлись, но для экпериментов — напрягает.
директивы могут быть вложенными
попробуй
#if 0/1 // condition 1
....
#if 0/1 // condition 2
....
#end if // condition 2
....
#endif // condition 1
Здравствуйте, WolfHound, Вы писали:
WH>Что, ни кто, ни разу не сталкивался с исследовательскими задачами, которые вообще не ясно как решать?
Сталкивался. И сложность задачи ни разу не оправдание делать криво. С другой стороны сталкивался с теми, кому контроль версий кажется чем-то нереально сложным и лишним.
Здравствуйте, Head Ache, Вы писали:
HA>директивы могут быть вложенными HA>попробуй
Это называется костыль. И нужно это исключительно из-за того что прямые методы не работают.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, vladimir.vladimirovich, Вы писали:
VV>Сталкивался. И сложность задачи ни разу не оправдание делать криво. С другой стороны сталкивался с теми, кому контроль версий кажется чем-то нереально сложным и лишним.
Ты похоже выдумал себе кучу каких то страшилок и с ними споришь.
А что касается версионника то: в чем смысл комитов с кучей неработоспособного мусора?
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, Шахтер, Вы писали:
Ш>Нет никакой проблемы изменить реализацию препроцессора и учесть вложенность комментариев. Задача плёвая.
Такое впечатление что народ вообще не читает что я пишу. Я еще в первом сообщении показал как это сделать с использованием парвильных инструментов.
Меняем это
И еще поймите наконец что двустадийный разбор текста (регулярный лексер + контекстно свободный парсер) вдалбливался во всех вузах на протяжении десятков лет. Народу просто в голову не приходило что можно иначе.
А когда накапливался опыт и приходило прозрение что что-то тут не так были уже мегатонны кода и обратная совместимость во всей красе.
Научный mainstream страшная штука.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, WolfHound, Вы писали:
WH>Здравствуйте, McSeem2, Вы писали:
WH>1)Разбор текста на токены. На это этапе отбрасываются пробелы и коментарии. WH>Тут все разбирается ужасно эффективными конечными автоматами.
Не все, для комментариев /* */, (* *) часто используют циклы. По крайней мере, это несложно сделать. Конечный автомат определяет только начало комментария.
Здравствуйте, McSeem2, Вы писали:
MS>Я верю тебе как родному, но скажи пожалуйста, чем принципиально отличается конструкция /* */ от { }? Только тем, что там два символа?
С синтаксической точки зрения -- ничем. Только вторая конструкция обычно разбирается синтаксическим анализатором, который работает на КС-грамматике, а первая -- это такой специальный токен, который лексер выделяет. Традиционно, языки токенов -- языки регулярныей, т.е. отношение иерархии не может быть реализовано. Вопрос в том, почему сложилась такая традиция -- лексический анализ проводить только над регулярными (читай автоматными) языками. Скажу честно -- не знаю. Скорее всего из простых соображений унификации. Лексический анализатор разделяет входной текст на слова, каждое из которых имеет совсем простой синтаксис (просто выражается в регулярности языка). Если считать словом то, что имеет синтаксис иерархии, то это не соответствует нашей интуиции. Ну слово -- это "acb", "3.123" или крайний случай "/* djdjdj */". Но назвать словом такую фигню:
/* dfsf
/* dsfsdfsdf
dfdsf
*/
*/
язык не поворачивается. Разметка уже наобходима, чтобы хорошо увидеть иерархию в слове -- это как раз и отражает сложность языка данного токена.
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Ты забыл, что речь идет о С++. Там прежде чем лексер с парсером запустить, должно препроцессирование выполниться. И в принципе во время препроцессирования убрать все комментарии вполне можно. Даже вложенные. Кстати, Borland C++ для DOS это умел. Так что ИМХО причины не в этом.
А кто сказал, что комментарии не нужны компилятору? Синтаксический анализ для проверки соответствия стилю -- вполне распространенная задача.
Здравствуйте, WolfHound, Вы писали:
WH>А что касается версионника то: в чем смысл комитов с кучей неработоспособного мусора?
Всё зависит от сложности — если проще накидать кода в комменты, чем в репозитарий, то надо накидывать. Если же с версионником проще, то зачем загромождать исходник?
Например, так — в мастер-ветке все коммиты рабочие, а исследования проводим в экспериментальных ветках. Т.е. ветки и rebase спасают в таких ситуациях.
Здравствуйте, mefrill, Вы писали:
M>А кто сказал, что комментарии не нужны компилятору? Синтаксический анализ для проверки соответствия стилю -- вполне распространенная задача.
А еще есть IDE... и по хорошему парсить код в IDE и компиляторе должен один и тот же код.
Вообще у меня бродит мысль научить свой генератор парсеров генерировать несколько AST.
Основное АСТ программы.
АСТ препроцессора.
АСТ коментариев.
При компиляции мы просто игнорируем два последних АСТ. А в случае с IDE мы можем получить из них всю информацию для подсветки, аутлайнининга, навигации, автокомплита,...
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, Mystic, Вы писали:
M>Не все, для комментариев /* */, (* *) часто используют циклы. По крайней мере, это несложно сделать. Конечный автомат определяет только начало комментария.
Цикл это деталь раелизации конечного автомата.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, Alexey931, Вы писали:
A>Каменты вида /* */ вообще оставлены только для совместимости с C. Они и там были сделаны не подумавши: A> a = b/*c; // Смысл выражения неприятно зависит от наличия или отсутствия пробела между / и *
Кстати о пробелах... http://blogs.msdn.com/b/ericlippert/archive/2010/10/04/no-backtracking-part-one.aspx
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн