2009-10-27 4 views
0

Je lis le fichier .c pour rechercher les fonctions qui y sont définies et compter le nombre de lignes dans chaque fonction. Mon problème est que je suis incapable de rechercher le nom/la signature de la fonction répartie sur plusieurs entrées. J'ai la liste des noms de fonctions du fichier .c et je fais correspondre les noms des fonctions de cette liste avec les fonctions du fichier .c pour les traiter plus avant.Script python pour correspondre à la signature de la fonction C sur plusieurs lignes

par exemple. Mon fichier .c est:

1. int main(
2.   void 
3.   ) 

la signature principale est répartie sur trois lignes.

et j'ai une liste de fonctions comme:

int main(void); 

comment puis-je correspondre à "int main (void)" avec les principaux multiligne dans le fichier .c? Je veux commencer à compter les lignes une fois la fonction trouvée.

Répondre

1

Je vous suggère d'écrire un analyseur simple pour le langage C.

Un des exemples dans le ANTLR book fait quelque chose de similaire à ce que vous recherchez.

Pyparsing est une très belle bibliothèque Python pour écrire des parseurs.

Voici un analyseur pour ANSI C: http://code.google.com/p/pycparser/ (écrit en utilisant une autre bibliothèque d'analyseurs Python, Ply).

0

Si vous avez la définition qui correspond "exactement" vous pouvez utiliser regex:

int\s+main\s*\(\s*void\s*\)\s*; 

où \ s * signifie zéro whitechars ou plus, et \ s + un ou plusieurs whitechars.

Pour l'utiliser avec la recherche multiligne vous pouvez le définir comme:

RE_MAIN = re.compile(r'int\s+main\s*\(\s*void\s*\)\s*;', re.MULTILINE | re.DOTALL) 

Par « exactement » Je veux dire qu'il ne correspond pas à la définition de la fonction comme

int main(); 

(vide omis)

De cette façon, vous pouvez trouver où commence la fonction, puis faire un simple calcul de scanner de caractères {et} se souvenir d'ignorer les commentaires et ignorer les constantes de caractères et de chaînes

Questions connexes