2016-05-05 2 views
1

- AKTUALISIERT -Perl regex - Finden Sie Funktionen in C-Datei und drucken ihre Definitionen

I C-Funktionen in der Datei finden möchten und ihre definitios

Zum Beispiel drucken:

Für diesen Eingang :

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

Die Ausgabe sollte sein:

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

Dies ist mein Code:

#!/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";} 

I mit Funktionstyp in arg 1 und die Funktion $ 2 $ am Ende in. Ich möchte den vollständigen Namen und die Argumente in '()' Klammern in $ 2 erhalten. Wie vermeide ich das Hauptwort? das^[(main)] funktioniert nicht. Am Ende möchte ich alles mit ';' Am Ende.

Es muss nach {} Klammern suchen, um nicht zu drucken, zum Beispiel: int x = (a + 1);

+1

Sie haben nicht einmal ein Slot für die Argumente der Funktion? –

Antwort

1

Versuchen Sie /(\S+)\s+(\S+\([^)]*\))/ und dann print $1+$2+";\n".

Um main mit negativem Look-Ahead zu verhindern:

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

Wenn Look-Ahead nicht unterstützt wird:

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

Der verantwortliche Teil main zur Vermeidung von:

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

Gute Arbeit. Können Sie es tun, indem Sie das Hauptwort vermeiden? – Piodo

+0

Unterstützt Perl Lookahead? –

+0

'/ (\ S +) \ s + ((?! main) \ S + \ ([^)] + \)) /' Es vermeidet die Hauptfunktion sehr gut, druckt aber keine anderen Funktionen als 'int'. Es gibt eine leere Funktion, die ebenfalls gedruckt werden sollte. – Piodo