57 votes

Y a-t-il une bonne bibliothèque Python qui peut analyser le C++ ?

Google n'a rien donné de pertinent.

J'ai une tonne de code C++ existant et fonctionnel, et j'aimerais utiliser Python pour le parcourir et trouver les relations entre les classes, etc.

EDIT: Juste pour préciser : je ne pense pas avoir besoin d'analyser chaque morceau de code C++; j'ai juste besoin de quelque chose assez intelligent pour repérer les déclarations de classes, de fonctions et de variables membres, et pour ignorer les définitions de fonctions.

0 votes

Vous ne pouvez pratiquement pas faire cela sans un analyseur C++ complet.

2 votes

Si vous êtes d'accord pour ne pas prendre en compte les cas marginaux de 0,1 %, vous pourriez probablement vous en sortir avec une analyse par expression régulière. Je suis assez convaincu que de nombreux éditeurs de texte le font pour la coloration syntaxique / l'analyse. Par exemple, Sublime Text est livré avec des fichiers d'analyse par expression régulière pour de nombreux langages, y compris le C++ (voir C++.tmLanguage).

48voto

Pavel Minaev Points 60647

Pas une réponse en soi, mais juste pour démontrer à quel point l'analyse correcte du C++ est en fait difficile. Ma démo préférée:

template struct a_t;

template<> struct a_t {
    template struct b {};
};

template<> struct a_t {
    enum { b };
};

typedef a_t a;

enum { c, d };
int main() {
    a::bd; // déclaration ou expression?
}

Ceci est parfaitement valable en C++ conforme aux normes, mais le sens exact de la ligne commentée dépend de votre implémentation. Si sizeof(void*)==sizeof(int) (typique sur les plates-formes 32 bits), il s'agit d'une déclaration de la variable locale d de type a::b. Si la condition n'est pas remplie, alors il s'agit d'une expression inopérante ((a::b < c) > d). Ajouter un constructeur pour a::b vous permettra en fait de mettre en évidence la différence via la présence/l'absence d'effets secondaires.

4 votes

Mauvais, oui, mais analysable tout à fait. J'ai mis à jour [this">stackoverflow.com/a/17393852/120163">ce]( <a href=) SO answer avec une analyse de ce code:

9 votes

C++ : difficile pour les humains, encore plus difficile pour les ordinateurs.

4 votes

@Dave: C++ : difficile pour les humains, moins difficile pour les ordinateurs. Je ne peux pas analyser cela personnellement sans geler mes deux moitiés de cerveau. Mon analyseur le gère très bien ; pas de moitiés de cerveau à geler.

38voto

Stef Points 2532

Le langage C++ est notoirement difficile à analyser. La plupart des personnes qui essaient de le faire correctement finissent par démonter un compilateur. En fait, c'est en partie pour cela que LLVM a été créé : Apple avait besoin d'une manière d'analyser le C++ pour une utilisation dans XCode qui correspondait à la manière dont le compilateur l'analysait.

C'est pourquoi il existe des projets comme GCC_XML que vous pourriez combiner avec une bibliothèque xml en python.

Certains projets non-compilateurs qui semblent faire un assez bon travail d'analyse du C++ sont :

  • Eclipse CDT
  • OpenGrok
  • Doxygen

2 votes

+1 - gcc-xml est la solution à privilégier, à moins que vous ne préfériez une solution payante (et coûteuse) comme le frontend EDG.

6 votes

Notez que gcc-xml ne parse pas tout. En particulier, les corps des fonctions ne sont pas analysés.

1 votes

Vous devriez également envisager swig , j'ai passé un bon moment avec github.com/kamanashisroy/swig le module csv.

6voto

Eli Bendersky Points 82298

Je rajoute ceci en tant que réponse distincte car il s'agit d'une nouvelle information :

Voici un article sur l'utilisation des liaisons Python de Clang pour analyser du C++.

6voto

jkp Points 20410

Pendant de nombreuses années, j'ai utilisé pygccxml, qui est un très agréable wrapper Python autour de GCC-XML. C'est un package très complet qui forme la base de certains outils de génération de code très utilisés comme py++ qui provient du même auteur.

5voto

jlarcombe Points 579

Vous ne trouverez pas de bibliothèque Python prête à l'emploi pour cela. L'analyse de C++ est délicate, et peu de parseurs ont été écrits qui ne font pas partie d'un compilateur. Vous pouvez trouver un bon résumé des problèmes ici.

Le meilleur choix pourrait être clang, car son support C++ est bien établi. Bien que cela ne soit pas une solution Python, il semble que cela pourrait être facilement réutilisable dans un wrapper Python, étant donné l'accent mis sur l'encapsulation et la bonne conception dans son développement.

4 votes

Vexant ? Carrément difficile.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X