2012-03-01 5 views
0

Мне нужно создать файл указателя функции. Я использую perl для того же самого. Мой вход - это список объявлений функций. Ниже приведены некоторые примеры:Объявление функции для объявления указателя функции с использованием perl

1.

char * cc_Hightor_ind(Closed* p_Closed); 
    to 
char * (*cc_Hightor_ind)(Closed* p_Closed); 

2.

char cc_Hightor_ind(Closed* p_Closed); 
    to 
char (*cc_Hightor_ind)(Closed* p_Closed); 

Это 2 обычные случаи, когда функция возвращает указатель и значение. Я не в состоянии решить о том, как преобразовать имя функции должно предшествовать (*.

Моя логика на поиске «_ind», я обратно-трек к началу слова и добавить (*. I я найти его трудно перевести этот код. Просьба предложить то же самое. в настоящее время я использую регулярное выражение для каждого типа данных и добавление добавления (* к нему, который является очень длительным процессом.

Спасибо заранее

ответ

1

Обновление по обновленному вопросу:

while(<DATA>) { 
    chomp; 
    s/(\*?\s+)(\w+\s*\()/$1(*$2)/; 
    say; 
} 
__DATA__ 
char * cc_Hightor_ind(Closed* p_Closed); 
char cc_Hightor_ind(Closed* p_Closed); 

выход:

char * (*cc_Hightor_ind)(Closed* p_Closed); 
char (*cc_Hightor_ind)(Closed* p_Closed); 
+0

Спасибо Но я не уверен, если это будет работать, если мой $ ул = «символ cc_Hightor_ind (Closed * p_Closed);»; – Aadishri

+1

@Aad: Конечно, это не сработает. Но что вы хотите в этом случае? Пожалуйста, добавьте еще несколько тестовых примеров (путем редактирования вашего вопроса), которые отвечали вашим потребностям. – Toto

+0

@Aad: см. Мой обновленный ответ. – Toto

2

Сродни обработки XML с регулярными выражениями, это никогда не будет 100% правильно, если не включать надлежащий C анализатор. Но вы можете написать что-то, что будет правильно для большинства распространенных ситуаций, и, возможно, всегда правильно для данного образца кода C, особенно если этот код автогенерируется.

Попробуйте это для первоначальной попытки, которая включает в себя оба образца кода, которые вы опубликовали. Если вы хотите, чтобы помочь вам больше, пожалуйста, опубликовать исчерпывающий пример того, что вы обрабатываете

use strict; 
use warnings; 

while (<DATA>) { 
    chomp; 
    (my $ptr = $_) =~ s/(\w+ \s*)\(/(*$1)(/x ; 
    print $ptr, "\n"; 
} 

__DATA__ 
char * cc_Hightor_ind(Closed* p_Closed); 
char cc_Hightor_ind(Closed* p_Closed); 

ВЫВОД

char * (*cc_Hightor_ind)(Closed* p_Closed); 
char (*cc_Hightor_ind)(Closed* p_Closed); 
1

К сожалению, у меня нет времени для полного ответа, но вот несколько дискуссий о разборе C в Perl. http://www.perlmonks.org/?node_id=746341 Возможно, это может дать вам некоторые идеи.

0

я пришел к следующему круглодонного о решении :-(

my $line = "char * cc_Hightor_ind(Closed* p_Closed);"; 
# split with white-space as delimiter 
my @splt = split (/\s/, $line); 
$count = split(/\s/, $line); 
#traverse through tokens 
for ($i = 0; $i < $count; $i++) { 
    # If token has '_ind', then prepend '(*' and append ')' to it 
    if ((@splt[$i] =~ s/_ind/_ind\)/)) { 

    @splt[$i] = "\(* @splt[$i]\) "; 

    } 
} 

    $line = join (" ", @splt); 
    print "$line\n"; 

#sample output 
#D:\gsa\mytries\prl>getFptr.pl 
#char * (* cc_Hightor_ind(Closed* p_Closed); 
Смежные вопросы