![]() |
|
Модераторы: ginnie |
![]()
|
|
| tiggi |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 22.5.2010 Где: Подмосковье Репутация: нет Всего: нет |
Изучаю Perl, для тренировки написал такую прогу, прокомментируйте. Что можно было бы сделать лучше?
C++ комментарии, как известно, бывают: однострочные // многострочные /* */ Учтён случай, когда комментирующие скобки являются частью строки.
Это сообщение отредактировал(а) tiggi - 23.5.2010, 00:55 |
|||
|
||||
| vadiml |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 27.7.2007 Репутация: нет Всего: 7 |
А Ваша программа как распознает:
int *p; y=(x/*p++); f(int /* коммент */ ); ЗЫ Это пример из книги Алена Голуба. |
|||
|
||||
| tiggi |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 22.5.2010 Где: Подмосковье Репутация: нет Всего: нет |
Вот в этом случае она будет работать некорректно, да
Спасибо, пример интересный, подумаю, но исправить эту ошибку будет непросто. Редактор gedit в Linux, например, в этом случае выделяет комментарий неправильно. |
|||
|
||||
| Marlik |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 212 Регистрация: 25.2.2007 Где: Рязань Репутация: нет Всего: нет |
Как при помощи регулярных выражений удалить из кода комментарии в стиле 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 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 22.5.2010 Где: Подмосковье Репутация: нет Всего: нет |
Marlik, здорово! Оказывается, всё можно было сделать одним регекспом.
Программа стала в разы меньше) Спасибо! |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Perl: Регулярные выражения | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |