Модераторы: korob2001, ginnie

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Форматер. 
:(
    Опции темы
dixoNICH
Дата 29.3.2011, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 222
Регистрация: 20.3.2011

Репутация: нет
Всего: нет



в общем, надо написать форматер из 1-го стиля во 2-ой и обратно.
лишь для фигурных скобок.
т.е
if() {
}
меняется на
if()
{
}
другая программкая делает обратное действие.
собственно, подскажите, как лучше сделать?
была идея написать регвыр, который бы находил мне конструкцию типа blabla(){ и добавлял как-то между ) и { перевод строки.
вот, только не знаю, как он бы добавлял.
или можно находить такие конструкции и добавлять их в массив, там как-то менять и засовывать обратно))
предложите, пожалуйста, пару своих идей, как вы бы это делали? )
PM MAIL   Вверх
alezzz
Дата 30.3.2011, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


сплю...
**


Профиль
Группа: Участник
Сообщений: 499
Регистрация: 17.8.2009

Репутация: 1
Всего: 14



как вариант регвыром:
Код

while (<ваш файл>){
    s/(\w+\s*\([^)]*\))\s*{\s*/$1\n{\n/;
}

PM MAIL   Вверх
arto
Дата 30.3.2011, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



if (*a == ')' || *a == '(') {
  printf("out\n");
}

?
PM MAIL ICQ   Вверх
alezzz
Дата 30.3.2011, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


сплю...
**


Профиль
Группа: Участник
Сообщений: 499
Регистрация: 17.8.2009

Репутация: 1
Всего: 14



ну да... с этим проблема, но тоже решаемо, все зависит от точной постановки задачи
PM MAIL   Вверх
dixoNICH
Дата 30.3.2011, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 222
Регистрация: 20.3.2011

Репутация: нет
Всего: нет



ну, постараюсь точнее :
есть файл с кодом на перле (т.е например если конструкция map { } то её надо тоже как-то отработать и оставить как она есть)
вход :
Код

if (a>b) { #ababababab
}

выход
Код

if(a>b) #ababababa
{
}

то есть из одного стиля форматирования в другой. и так же обрабатывать комментарии. т.е, теперь до меня дошло, что если просто добавлять перевод строки, то комментарии тоже улетят ниже на строчку smile
PM MAIL   Вверх
alezzz
Дата 30.3.2011, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


сплю...
**


Профиль
Группа: Участник
Сообщений: 499
Регистрация: 17.8.2009

Репутация: 1
Всего: 14



и все-таки не до конца точно.
вот такая заготовка:
Код

while (<>){
    s/(\w+\s*\(.*\))\s*{\s*(#.*)?\n/$1 $2\n{\n/;
}


при условии что:
1. делать перенос "{" если перед этим есть слово и скобки, например if(), while() и т.д.
2. не делать перенос если нет скобок, например map {}.
3. учитывать комментарии при переносе по п.1

проверял на:
Цитата

if(($a == 1) &&($b == 2)){ #comment
    print;
} 

map { .... }

PM MAIL   Вверх
arto
Дата 30.3.2011, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



perldoc Perl::Tidy
PM MAIL ICQ   Вверх
dixoNICH
Дата 31.3.2011, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 222
Регистрация: 20.3.2011

Репутация: нет
Всего: нет



Цитата(alezzz @ 30.3.2011,  14:33)
и все-таки не до конца точно.
вот такая заготовка:
Код

while (<>){
    s/(\w+\s*\(.*\))\s*{\s*(#.*)?\n/$1 $2\n{\n/;
}


при условии что:
1. делать перенос "{" если перед этим есть слово и скобки, например if(), while() и т.д.
2. не делать перенос если нет скобок, например map {}.
3. учитывать комментарии при переносе по п.1

проверял на:
Цитата

if(($a == 1) &&($b == 2)){ #comment
    print;
} 

map { .... }

Код

s/(\w+\s*\(.*\))\s*{\s*(#.*)?\n/$1 $2\n{\n/;

(\w+\s*\(.*\))
это обработка оператора и скобок, это я понял
\s*
пробелы 
дальше открывающаяся скобка - это что ? )
вторая часть регвыра не совсем понятна)
PM MAIL   Вверх
alezzz
Дата 1.4.2011, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


сплю...
**


Профиль
Группа: Участник
Сообщений: 499
Регистрация: 17.8.2009

Репутация: 1
Всего: 14



Код

s/
    (            
        \w+    # слово (if, while и т.д.)
        \s*     # если есть пробелы между словом и скобкой
        \(       # скобка
        .*       # то что в скобках
        \)        # последняя скобка
    )             # все это в $1
    \s*         # если есть пробелы между "if()" и "{"
    {            # "{"
    \s*         # если есть пробелы после "{"
    (
        \#.*   # комментарий, тут экранирую "#" т.к. режим /x
    )?           # помещаем в $2, комментария может и не быть
    \n           # перевод строки
/$1 $2\n{\n/x;

PM MAIL   Вверх
arto
Дата 1.4.2011, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



не работает:

# perl -plne 's/(\w+\s*\(.*\))\s*{\s*(#.*)?\n/$1 $2\n{\n/;'
if (a == b) {
  print;
}
^D
if (a == b) {
  print;
}
# 
PM MAIL ICQ   Вверх
alezzz
Дата 1.4.2011, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


сплю...
**


Профиль
Группа: Участник
Сообщений: 499
Регистрация: 17.8.2009

Репутация: 1
Всего: 14



Код

$str = 'if (a == b) {
  print;
}
';
print "1:\n", $str;
$str =~ s/(\w+\s*\(.*\))\s*{\s*(#.*)?\n/$1 $2\n{\n/m;
print "2:\n", $str;

Вывод:
Цитата

1:
if (a == b) { 
  print;
}
2:
if (a == b) 
{
  print;
}

 

PM MAIL   Вверх
dixoNICH
Дата 1.4.2011, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 222
Регистрация: 20.3.2011

Репутация: нет
Всего: нет



Цитата(alezzz @ 1.4.2011,  12:55)
Код

s/
    (            
        \w+    # слово (if, while и т.д.)
        \s*     # если есть пробелы между словом и скобкой
        \(       # скобка
        .*       # то что в скобках
        \)        # последняя скобка
    )             # все это в $1
    \s*         # если есть пробелы между "if()" и "{"
    {            # "{"
    \s*         # если есть пробелы после "{"
    (
        \#.*   # комментарий, тут экранирую "#" т.к. режим /x
    )?           # помещаем в $2, комментария может и не быть
    \n           # перевод строки
/$1 $2\n{\n/x;

Код

s/([\s*\t*])(\w+\s*\(.*\))\s*{\s*(#.*)?\n/$1 $2\n{\n/

а как ещё отодвинуть {
на колличество пробелов/табуляций, которое стоит перед оператором?
([\s*\t*]) добавил это в начало, но, как использовать не знаю(
PM MAIL   Вверх
alezzz
Дата 1.4.2011, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


сплю...
**


Профиль
Группа: Участник
Сообщений: 499
Регистрация: 17.8.2009

Репутация: 1
Всего: 14



Код

s/^((\s*)\w+\s*\(.*\))\s*{\s*(#.*)?\n/$1 $3\n$2\{\n/;

PM MAIL   Вверх
arto
Дата 1.4.2011, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



а такое сможет?
if (a == b) { # ) {
  ...
}
PM MAIL ICQ   Вверх
dixoNICH
Дата 1.4.2011, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 222
Регистрация: 20.3.2011

Репутация: нет
Всего: нет



Цитата(alezzz @ 1.4.2011,  14:59)
Код

s/^((\s*)\w+\s*\(.*\))\s*{\s*(#.*)?\n/$1 $3\n$2\{\n/;

спасибо огромное, всё, на чём проверял, работает)

2 arto, да, работает на твоём примере
PM MAIL   Вверх
alezzz
Дата 1.4.2011, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


сплю...
**


Профиль
Группа: Участник
Сообщений: 499
Регистрация: 17.8.2009

Репутация: 1
Всего: 14



Нет, на примере arto, не работает. 

Сам незнаю как это обработать, могут быть любые варианты вплоть до if (a == " bla-bla-bla # bla-bla-bla" ) { # comment

Это сообщение отредактировал(а) alezzz - 1.4.2011, 17:06
PM MAIL   Вверх
dixoNICH
Дата 1.4.2011, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 222
Регистрация: 20.3.2011

Репутация: нет
Всего: нет



да?
у меня всё замечательно работает на этих примерах)))))
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0555 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.