| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Perl: Общие вопросы > Форматер. |
| Автор: dixoNICH 29.3.2011, 18:50 |
| в общем, надо написать форматер из 1-го стиля во 2-ой и обратно. лишь для фигурных скобок. т.е if() { } меняется на if() { } другая программкая делает обратное действие. собственно, подскажите, как лучше сделать? была идея написать регвыр, который бы находил мне конструкцию типа blabla(){ и добавлял как-то между ) и { перевод строки. вот, только не знаю, как он бы добавлял. или можно находить такие конструкции и добавлять их в массив, там как-то менять и засовывать обратно)) предложите, пожалуйста, пару своих идей, как вы бы это делали? ) |
| Автор: alezzz 30.3.2011, 10:16 | ||
как вариант регвыром:
|
| Автор: arto 30.3.2011, 11:10 |
| if (*a == ')' || *a == '(') { printf("out\n"); } ? |
| Автор: alezzz 30.3.2011, 11:15 |
| ну да... с этим проблема, но тоже решаемо, все зависит от точной постановки задачи |
| Автор: dixoNICH 30.3.2011, 14:03 | ||||
| ну, постараюсь точнее : есть файл с кодом на перле (т.е например если конструкция map { } то её надо тоже как-то отработать и оставить как она есть) вход :
выход
то есть из одного стиля форматирования в другой. и так же обрабатывать комментарии. т.е, теперь до меня дошло, что если просто добавлять перевод строки, то комментарии тоже улетят ниже на строчку |
| Автор: alezzz 30.3.2011, 14:33 | ||||
| и все-таки не до конца точно. вот такая заготовка:
при условии что: 1. делать перенос "{" если перед этим есть слово и скобки, например if(), while() и т.д. 2. не делать перенос если нет скобок, например map {}. 3. учитывать комментарии при переносе по п.1 проверял на:
|
| Автор: arto 30.3.2011, 15:19 |
| perldoc Perl::Tidy |
| Автор: dixoNICH 31.3.2011, 19:18 | ||||||||
(\w+\s*\(.*\)) это обработка оператора и скобок, это я понял \s* пробелы дальше открывающаяся скобка - это что ? ) вторая часть регвыра не совсем понятна) |
| Автор: alezzz 1.4.2011, 12:55 | ||
|
| Автор: arto 1.4.2011, 13:05 |
| не работает: # perl -plne 's/(\w+\s*\(.*\))\s*{\s*(#.*)?\n/$1 $2\n{\n/;' if (a == b) { print; } ^D if (a == b) { print; } # |
| Автор: alezzz 1.4.2011, 14:35 | ||||
Вывод:
|
| Автор: dixoNICH 1.4.2011, 14:53 | ||||||
а как ещё отодвинуть { на колличество пробелов/табуляций, которое стоит перед оператором? ([\s*\t*]) добавил это в начало, но, как использовать не знаю( |
| Автор: alezzz 1.4.2011, 14:59 | ||
|
| Автор: arto 1.4.2011, 15:07 |
| а такое сможет? if (a == b) { # ) { ... } |
| Автор: dixoNICH 1.4.2011, 15:23 | ||||
спасибо огромное, всё, на чём проверял, работает) 2 arto, да, работает на твоём примере |
| Автор: alezzz 1.4.2011, 16:55 |
| Нет, на примере arto, не работает. Сам незнаю как это обработать, могут быть любые варианты вплоть до if (a == " bla-bla-bla # bla-bla-bla" ) { # comment |
| Автор: dixoNICH 1.4.2011, 20:07 |
| да? у меня всё замечательно работает на этих примерах))))) |