2016-05-05 1 views
1

- ОБНОВЛЕНО -Perl регулярное выражение - Найти функции в файле C и распечатать их определения

Я хочу найти функции C в файл и распечатать их definitios

Например:

Для этого входа :

#include <stdlib> 

int function(int a) 
{ 
    return a; 
} 

void func2() 
{ 
    int b = 1; 
} 

int func3(int a,int b) 
{ 
    a = a +b; 
     while(x) { 
      x--; 
     } 
    return a; 
} 

int main(int argc, char* argv[]) 
{ 
    int x=(a+1); 
    return 0; 
} 

Вывод должен быть:

int function(int a); 
void func2(); 
int func3(int a,int b); 

Это мой код:

#!/usr/bin/perl -w 
open(FILE, "<", $ARGV[0]) or die "file open error"; 

if (@ARGV) #if there are args 
{ 
    if (-f $ARGV[0]) #if its regular file 
    { 

    while(<FILE>) 
     { 
     if ($_ =~ /(.+)\s(.+)\(/){ 
     print $1; # type in arg $1 
     print "\n"; 
     print $2; # name in arg $2 
     print "\n"; 
    } 
     } 
    } 
    else{ 
print "Arg is not a file\n";} 
} 
else{ 
print "no args\n";} 

Я заканчиваю с типом функции в арг $ 1 и имя функции в $ 2. Я хочу получить полное имя и аргументы в скобках '()' в $ 2. Как избежать «основного» слова? '^ [(main)] не работает. В конце я хочу напечатать все это с помощью;; в конце.

Для того, чтобы не печатать, например: int x = (a + 1), необходимо проверить {} скобки;

+1

Вы даже не имеют слот для аргументов функции? –

ответ

1

Попробуйте /(\S+)\s+(\S+\([^)]*\))/, а затем print $1+$2+";\n".

Для предотвращения main с отрицательного предпросмотра:

/(\S+)\s+((?!main)\S+\([^)]*\))/ 

Если опережения не поддерживается:

/(\S+)\s+((m|ma|mai|[^m].*|m[^a].*|ma[^i].*|mai[^n].*)\([^)]*\))/ 

Часть отвечает за избежать main:

(m|ma|mai|[^m].*|m[^a].*|ma[^i].*|mai[^n].*) 
+0

Хорошая работа. Можете ли вы сделать это, избегая «основного» слова? – Piodo

+0

Поддерживает ли perl поддержку? –

+0

'/ (\ S +) \ s + ((! Main) \ S + \ ([^)] + \)) /' Очень хорошо избегает основной функции, но не печатает другие функции, кроме типа 'int'. Существует недействительная функция, которая также должна печататься. – Piodo

Смежные вопросы