объявление функции для объявления указателя функции с использованием perl - PullRequest
0 голосов
/ 01 марта 2012

Мне нужно создать файл указателя на функцию.Я использую 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Мне сложно перевести это в код. Пожалуйста, предложите то же самое. В настоящее время я использую регулярное выражение для каждого типа данных и добавляю добавление (* к нему, что является очень длительным процессом.

Заранее спасибо

Ответы [ 4 ]

2 голосов
/ 01 марта 2012

Сродни обработке 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);

OUTPUT

char * (*cc_Hightor_ind)(Closed* p_Closed);
char (*cc_Hightor_ind)(Closed* p_Closed);
1 голос
/ 02 марта 2012

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

1 голос
/ 01 марта 2012

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

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 голосов
/ 02 марта 2012

Я пришел к следующему обходному решению: - (

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...