2009-10-05 11 views
10

Je cherche un moyen d'analyser le code C++ pour récupérer des informations de base sur les classes. Je n'ai pas vraiment besoin de beaucoup d'informations du code lui-même, mais j'en ai besoin pour gérer des choses comme les macros et les templates. En bref, je veux extraire la "structure" du code, ce que vous montreriez dans un diagramme UML.Quelles bibliothèques sont disponibles pour l'analyse de C++ pour extraire des informations de type

Pour chaque classe/struct/union/ENUM/typedef dans la base de code, tout ce que je besoin (après modèles & macros ont été traitées) est:

  • Leur nom
  • L'espace de noms dans lequel ils vivent
  • Les champs contenus dans (nom du type, le nom des restrictions sur le terrain et l'accès, comme privé/mutable/etc)
  • fonctions contenues dans (type de retour, nom, paramètres)
  • Le fichier
  • déclarant ligne/numéros de colonne (ou décalage d'octets dans le fichier) où la définition de ces données commence

Les instructions réelles dans le code ne sont pas pertinents pour mes besoins. Je prévois beaucoup de gens disant que je devrais juste utiliser une regex pour cela (ou même Flex & Bison), mais ceux-ci ne sont pas vraiment valides, car j'ai besoin du préprocesseur et du matériel de gabarit manipulés correctement.

+0

Même si vous avez développé les directives de préprocesseur et de modèle, regexp ne sera pas assez puissant pour collecter correctement ces informations de type. –

Répondre

5

Cela ressemble à un travail pour gcc-xml en combinaison avec la bibliothèque xml-library C++ ou le langage de script xml-friendly de votre choix.

+0

De la description sur la page que vous avez liée, cela sonne exactement comme ce dont j'ai besoin. –

+0

Cool, la faq dit aussi que les templates instanciés sont aussi enregistrés, cela semble parfait (seule la chose qui semble manquer, c'est le "corps des fonctions", qui est la seule chose dont je n'ai vraiment pas besoin) –

+0

Je pense que c'est pratique pour les cas plus simples. –

4

Exécution Doxygen sur le code vous donnerait la plupart de cela, non?

Dans quel format voulez-vous la sortie?

+0

D'après ce que j'ai vu, Doxygen ne peut vraiment produire que des données conviviales pour les humains, l'analyse syntaxique pouvant prendre un peu plus pour un programme, j'en ai juste besoin dans un format où je peux facilement accéder à ces informations par le code. –

+0

Doxygen peut également produire du XML: http://www.doxygen.nl/config.html#cfg_generate_xml –

0

Vous pouvez facilement développer les macros en exécutant simplement le pré-processeur (cpp) sur la source. Les modèles ne sont pas si simples car l'instanciation du modèle se produit beaucoup plus tard.

+0

C'était une option que j'avais dans le dos de mon esprit, mais j'ai récemment eu quelques transactions avec le préprocesseur pour 2 complètement différents fournisseurs (un sony, l'autre MS) et la sortie qu'ils donnent est en fait différente de ce qui est utilisé en interne (MS MIGHT est juste une erreur d'espace, mais cela provoque des erreurs qui empêchent la création du fichier pré-traité. J'ai encore besoin de quelque chose pour passer le code –

2

Exuberant Ctags vous donnera la plupart de ce dont vous avez besoin, il est généralement utilisé par les éditeurs pour fournir la navigation de code.
Peut s'étouffer sur certains modèles ...

0

Doxygen peut également produire un XML détaillé en définissant une option dans le fichier de configuration. C'est très complet et très facile à utiliser. De l'Doxygen home page:

La sortie XML se compose d'un structuré « décharge » des informations recueillies par doxygen. Chaque composé (class/namespace/file/...) possède son propre fichier XML et il existe également un fichier index appelé index.xml.

Un fichier appelé script XSLT combine.xslt est également généré et peut être utilisé pour combiner tous les fichiers XML en un seul fichier . Doxygen génère également deux fichiers XML fichiers index.xsd (pour le fichier d'index) et composé.xsd (pour les fichiers composés ). Ce fichier de schéma décrit les éléments possibles, leurs attributs et comment ils sont structurés, c'est-à-dire le décrit la grammaire des fichiers XML et peut être utilisé pour la validation ou pour piloter des scripts XSLT.

Dans le répertoire addon/doxmlparser vous peut trouver une bibliothèque d'analyseur pour la lecture la sortie XML produit par doxygen dans manière incrémentale (voir addon/doxmlparser/include/doxmlintf.h pour l'interface de la bibliothèque)

2

Le DMS Software Reengineering Toolkit est un appareil d'analyse et de transformation de programme à usage général. Son s'appuie sur DMS pour fournir une analyse C++ complète pour une variété de dialectes C++ communs, peut traiter un ensemble de classes C++ simultanément et construit des informations complètes de nom/type/accès que vous pouvez utiliser comme vous le souhaitez. L'information est étiquetée comme fichier d'origine/ligne/colonne précise. (Il comprend un préprocesseur complet).

Vous avez raison; regex ne peut même pas s'en approcher.

+0

Corrigez-moi si je me trompe: une solution à moitié cuite ne sera pas utile; soit on l'analyse en entier, soit on obtient des résultats erronés/manquants, quel que soit le processus d'extraction auquel on soumet le code. – MaD70

+0

La signification du code est assez fragile et dépend essentiellement de la signification des symboles de l'utilisateur. Des erreurs mineures dans l'interprétation de cette signification se répercutent habituellement dans les résultats de quelques opérateurs en aval qui n'ont aucun sens. Si vous n'analysez pas C++ en détails atroces, vous ne pouvez pas vraiment construire d'analyseurs intéressants, encore moins d'outils qui peuvent changer le code de manière fiable. –

+0

Merci de partager avec nous votre expérience, Ira. – MaD70

4

Voir également Ira Baxter ici, où il cites his own product.

Attention: attention, seulement Elsa "... j'entends faire un assez bon travail .." à la construction d'une table de symboles, qui selon Ira Baxter est nécessaire pour l'intention originale de OP (voir les commentaires à cette réponse - Je le cite parce qu'il est un expert dans le domaine).

+0

Poursuivant le commentaire, notez que l'OP voulait un moyen simple d'extraire des informations de type et de générer des choses à partir de cela. Gérer cela avec des parseurs C++ complets est beaucoup trop long et inutile, d'autant plus que le coût de l'analyseur syntaxique -> xml -> C++ ne sera pas payé au moment de l'exécution. En dehors de cela, belle liste. –

+0

Vous sous-estimez la complexité de l'analyse XML. Comme l'a noté Ira Baxter (il est un expert dans le domaine) "* Vous avez raison, regex ne peut même pas s'en approcher *" et il veut dire (Ira corrigez-moi si je me trompe) qu'une solution à moitié cuite ne pas être utile. L'analyse de C++ est notoirement difficile et sans analyse complète, j'attends des résultats erronés/manquants dans le processus d'extraction auquel vous soumettez le code. – MaD70

+1

Vous devez non seulement analyser, mais vous devez également créer la table de symboles. Et c'est une chienne; les règles pour cela occupent la majeure partie du manuel de référence de 600 pages. Les analyseurs C++ basés sur ANTLR, OpenC++, Stratego, ne le font pas. La thèse de Willink est légèrement intéressante mais je ne connais personne qui ait utilisé ses résultats dans la colère. Elsa, j'entends faire un assez bon travail. Je pense que Clang dit que leur analyseur C++ est incomplet à ce stade. GCC-XML fait un bon travail si tout ce que vous voulez est de taper des données et que cela ne vous dérange pas les tonnes de XML qu'il produit. DMS le fait et produit également des informations sur le corps de la fonction. –

Questions connexes