Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Форматер.


Автор: dixoNICH 29.3.2011, 18:50
в общем, надо написать форматер из 1-го стиля во 2-ой и обратно.
лишь для фигурных скобок.
т.е
if() {
}
меняется на
if()
{
}
другая программкая делает обратное действие.
собственно, подскажите, как лучше сделать?
была идея написать регвыр, который бы находил мне конструкцию типа blabla(){ и добавлял как-то между ) и { перевод строки.
вот, только не знаю, как он бы добавлял.
или можно находить такие конструкции и добавлять их в массив, там как-то менять и засовывать обратно))
предложите, пожалуйста, пару своих идей, как вы бы это делали? )

Автор: alezzz 30.3.2011, 10:16
как вариант регвыром:
Код

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

Автор: 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 { } то её надо тоже как-то отработать и оставить как она есть)
вход :
Код

if (a>b) { #ababababab
}

выход
Код

if(a>b) #ababababa
{
}

то есть из одного стиля форматирования в другой. и так же обрабатывать комментарии. т.е, теперь до меня дошло, что если просто добавлять перевод строки, то комментарии тоже улетят ниже на строчку smile

Автор: 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 { .... }

Автор: arto 30.3.2011, 15:19
perldoc Perl::Tidy

Автор: dixoNICH 31.3.2011, 19:18
Цитата(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*
пробелы 
дальше открывающаяся скобка - это что ? )
вторая часть регвыра не совсем понятна)

Автор: alezzz 1.4.2011, 12:55
Код

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

Автор: 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
Код

$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;
}

 

Автор: dixoNICH 1.4.2011, 14:53
Цитата(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*]) добавил это в начало, но, как использовать не знаю(

Автор: alezzz 1.4.2011, 14:59
Код

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

Автор: arto 1.4.2011, 15:07
а такое сможет?
if (a == b) { # ) {
  ...
}

Автор: dixoNICH 1.4.2011, 15:23
Цитата(alezzz @ 1.4.2011,  14:59)
Код

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

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

2 arto, да, работает на твоём примере

Автор: alezzz 1.4.2011, 16:55
Нет, на примере arto, не работает. 

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

Автор: dixoNICH 1.4.2011, 20:07
да?
у меня всё замечательно работает на этих примерах)))))

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)