| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Perl: Регулярные выражения > Скрипт, убирающий C++ комментарии |
| Автор: tiggi 22.5.2010, 22:58 | ||
| Изучаю Perl, для тренировки написал такую прогу, прокомментируйте. Что можно было бы сделать лучше? C++ комментарии, как известно, бывают: однострочные // многострочные /* */ Учтён случай, когда комментирующие скобки являются частью строки.
|
| Автор: vadiml 22.5.2010, 23:36 |
| А Ваша программа как распознает: int *p; y=(x/*p++); f(int /* коммент */ ); ЗЫ Это пример из книги Алена Голуба. |
| Автор: tiggi 23.5.2010, 00:39 |
| Вот в этом случае она будет работать некорректно, да Спасибо, пример интересный, подумаю, но исправить эту ошибку будет непросто. Редактор gedit в Linux, например, в этом случае выделяет комментарий неправильно. |
| Автор: Marlik 14.6.2010, 17:56 |
| Как при помощи регулярных выражений удалить из кода комментарии в стиле C? Хотя это возможно, это намного сложней, чем кажется. Так, однострочник perl -0777 -pe 's{/\*.*?\*/}{}gs' foo.c будет работать во многих, но не во всех случаях. Это слишком просто для отдельных программ на C, в частности, тех, которые содержат «комментарии» внутри строк. В этом случае нужно нечто вроде скрипта, созданного Джефри Фридлом и доработанного Фредом Кёртисом. $/ = undef; $_ = <>; s#/\*[^*]*\*+([^/*][^*]*\*+)*/|("(\\.|[^"\\])*"|'(\\.|[^'\\])*'|.[^/"'\\]*)#defined $2 ? $2 : ""#gse; print; Конечно, это можно записать более понятно с модификатором /x, если отформатировать шаблон и расставить комментарии. Вот развернутая запись, любезно предоставленная Фредом Кёртисом. s{ /\* ## Начало комментария /* ... */ [^*]*\*+ ## Отличный от * символ с последующим 1 и более * ( [^/*][^*]*\*+ )* ## 0 и более подстрок, не начинающихся с / ## но заканчивающихся на '*' / ## Конец комментария /* ... */ | ## ИЛИ разные вещи, не являющиеся комментариями: ( " ## Начало строки " ... " ( \\. ## Экранированный символ | ## ИЛИ [^"\\] ## Не "\ )* " ## Конец строки " ... " | ## ИЛИ ' ## Начало строки ' ... ' ( \\. ## Экранированный символ | ## ИЛИ [^'\\] ## Не '\ )* ' ## Конец строки ' ... ' | ## ИЛИ . ## Любой другой символ [^/"'\\]* ## Символы, с которых не начинается комментарий, строка, экранированный символ ) }{defined $2 ? $2 : ""}gxse; Небольшая доработка также удаляет комментарии C++, не продолжающиеся на нескольких строках при помощи символа продолжения строки: s#/\*[^*]*\*+([^/*][^*]*\*+)*/|//[^\n]*|("(\\.|[^"\\])*"|'(\\.|[^'\\])*'|.[^/"'\\]*)#defined $2 ? $2 : ""#gse; Источник: http://beshenov.ru/perlfaq/6.html |
| Автор: tiggi 19.8.2010, 22:32 |
| Marlik, здорово! Оказывается, всё можно было сделать одним регекспом. Программа стала в разы меньше) Спасибо! |