IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Analyser du code C/C++: d�tecter les struct, class et fonctions


Sujet :

C++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre �clair� Avatar de Rodrigue
    Inscrit en
    Ao�t 2002
    Messages
    487
    D�tails du profil
    Informations forums :
    Inscription : Ao�t 2002
    Messages : 487
    Par d�faut Analyser du code C/C++: d�tecter les struct, class et fonctions
    Bonjour,

    Je souhaiterais analyser du code C/C++. Dans un premier temps, je souhaiterais d�tecter toutes les fonctions d�clar�es dans plusieurs fichiers ainsi que les classes et les structures. Connaissez-vous un projet �quivalent assez simple � comprendre en open-source (ex.: doxygen)?

    Comment vous y prendriez-vous?

  2. #2
    Membre exp�riment�

    Inscrit en
    Mai 2005
    Messages
    132
    D�tails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 132
    Par d�faut
    Salut,

    ca depond de system, essaye BoUML, StarUML ou Umbrella.

    Fredy

  3. #3
    Expert confirm�
    Avatar de Luc Hermitte
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2003
    Messages
    5 296
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : A�ronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Ao�t 2003
    Messages : 5 296
    Par d�faut
    Qu'entends-tu par "analyser" ?
    Je partirai sur ctags personnellement.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne r�ponds � aucune question technique par le biais de ce m�dia. Et de toutes fa�ons, ma BAL sur dvpz est pleine...

  4. #4
    Expert confirm�

    Inscrit en
    Novembre 2005
    Messages
    5 145
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par d�faut
    Citation Envoy� par Luc Hermitte Voir le message
    Qu'entends-tu par "analyser" ?
    Je partirai sur ctags personnellement.
    Ou cscope.

    Je ne connais pas de front-end C++ facilement utilisable (ca ferait d'ailleurs un beau projet)

  5. #5
    Expert confirm�

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 43
    Localisation : France, H�rault (Languedoc Roussillon)

    Informations professionnelles :
    Activit� : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par d�faut
    Note qu'a cause du pr�processeur, un bete analyse du code peut passer a cot� de d�clarations si le code utilise des macros etc...
    On trouve des exemples de code int�ressants dans les exemples de boost : un pr�processeur complet, un "extracteur" de d�clarations de classes, ...

  6. #6
    Membre �m�rite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    D�tails du profil
    Informations personnelles :
    �ge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Par d�faut
    Je crois savoir que Eclipe CDT et Code::Blocks utilisent tout deux ctags pour impl�menter leur auto-completion, �a fait d�ja un point de d�part.

  7. #7
    Membre �clair� Avatar de Rodrigue
    Inscrit en
    Ao�t 2002
    Messages
    487
    D�tails du profil
    Informations forums :
    Inscription : Ao�t 2002
    Messages : 487
    Par d�faut
    Merci pour vos r�ponses, je vais regarder ces diff�rents projets

    Qu'entends-tu par "analyser" ?
    Je voudrais parser du code C ou C++ sous la forme d'un fichier XML dans un "pseudo-langage" (les imbriquements repr�senteraient une structure de type arbre).

    Un code de ce type:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    int Add(int A, int B); //déclaration de fonction
     
    int g1=0, g2; /*variable globale
    avec un commentaire sur plusieurs lignes */
     
    struct test {
    float a;
    double b;
    std::string c;
    };
     
    /**
     * Fonction principale
     **/
     
    int main(int argc, char* argv[])
    {
       int i, j;
       test k;
       bool isOk = true;
     
       k.a = 3.14;
     
       //...
     
       if(isOk)
       {
            //...
       } else {
           //...
       }   
    }
     
    int Add(int A, int B)
    {
       return A + B;
    }

    devrait devenir (dans ce genre l�, je l'ai fait vite fait ):
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    <FUNCTION_DECL>
       <NAME>Add</NAME>
       <RETURN_TYPE>int</RETURN_TYPE>
       <PARAMS>
          <P1>
          	<NAME>A</NAME>
          	<TYPE>int</TYPE>
          </P1>
          <P2>
          	<NAME>B</NAME>
          	<TYPE>int</TYPE>
          </P2>
       </PARAMS>
    </FUNCTION_DECL>
     
    <GLOBAL_VAR>
    int g1=0, g2; /*variable globale
    avec un commentaire sur plusieurs lignes */
    </GLOBAL_VAR>
     
    <STRUCTURE>
    struct test {
    float a;
    double b;
    std::string c;
    };
    </STRUCTURE>
     
    /**
     * Fonction principale
     **/
     
     <FUNCTION>
    int main(int argc, char* argv[])
    {
       int i, j;
       test k;
       bool isOk = true;
     
       k.a = 3.14;
     
       //...
     
       if(isOk)
       {
            //...
       } else {
           //...
       }   
    }
    </FUNCTION>
     
    <FUNCTION>
    int Add(int A, int B)
    {
       return A + B;
    }
    </FUNCTION>
    Remarquez que j'ai fort d�taill� le premier bloc. Dans un premier, je me contenterais tr�s bien de r�cup�rer la structure globale d'un fichier source

    Merci beaucoup pour votre aide! J'esp�re que vous voyez mieux ce que je souhaite r�aliser... si vous avez des questions, n'h�sitez surtout pas � me les poser

  8. #8
    Membre �m�rite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    D�tails du profil
    Informations personnelles :
    �ge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Par d�faut
    Je sans que Doxygen (ou un module) est capable de g�n�rer du xml, ce serait peut-�tre une piste � explorer.
    En tous cas je ne peux que te conseiller de r�utiliser l'un des (rares) programmes qui sont capables de te macher le travail, faire son propre compilo C++ rel�ve de la d�mence

  9. #9
    Expert �minent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activit� : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par d�faut
    Salut,

    Si tu veux vraiment tout faire � la main, il faut que tu r�fl�chisse � ce qui peut se trouver, et dans quel ordre, dans un fichier de code source (dans le fichier d'en-t�te, d'abord, puis dans le fichier d'impl�mentation )

    Ainsi, tu te rendra compte que tu peux trouver:
    • Des commandes pr�processeurs (lignes commen�ant par #
    • des commentaire, uni et multi lignes (commen�ant par // ou commencant par /* et terminant par */
    • des mots cl�s (class, struct, friend)
    • des indicateurs sur l'accessibilit� des �l�ments (private, protected, public)
    • des blocs (commencant par { et terminant par })
    • des listes d'arguments (commencant par ( et terminant par ) )
    • des tailles de tableau (commencant par [ et terminant par ] )
    • des sp�cificateurs de classe de stockage (extern, static, register,...)
    • des qualificateurs constant/volatile (const et volatile)
    • une repr�sentation de l'utilisation de m�moire (r�f�rence, pointeur, pointeur de pointeur)
    • des "fins d'instructions" (";")
    • des identifiants
    • ...

    Tu remarquera que les mots cl�s ont une signification pr�cise et que tous ces �l�ments se trouvent g�n�ralement dans un ordre pr�cis, mais que certains sont incompatible entre eux:
    • tu ne peux pas d�clarer une variable sous la forme de Type& Mavar[10]
    • Une d�claration de variable prend une synthaxe du genre de <S C Spec> <C V Qual> Type<utilisation memoire> nom <taille>
    • une d�claration de fonction prend une synthaxe du genre de <inline><S C Spec | virtualite> <C V Qual> Type_de_retour<utilisation m�moire> Nom(<liste d'arguments>)<throw(<liste d'erreur>)> <C V Qual>;
    • une d�claration de classe prend la forme de class NomDeClass <: <visibilit�> classe mere> <, <visibilit�> classe_mere> (plusieurs fois possible) >{
    • Un indicateur de visibilit� s'applique jusqu'� ce qu'un autre indicateur soit plac�
    • tous les �l�ment "facultatifs" ont une valeur par d�faut, qui peut varier en fonction des circonstances (par exemple: la visibilit� par d�faut d'une structure est publique, alors qu'elle est priv�e pour les classes)
    • ...


    Ce ne sont, bien sur, que quelques exemples des choses auxquelles tu dois �tre attentif

    A partir de l� tu pourras commencer � te dire que ton fichier, ce n'est qu'un arbre N-aire, dont la racine est... le fichier.

    La racine peut contenir une collection d'objets parmis
    • un instruction preprocesseurs
    • une d�claration de variables (libre)
    • une d�claration de fonctions (libre)
    • une espace de nommage
    • une (pr�)d�claration de classe ou de structure
    Un espace de nomage peut contenir une collection d'objets exactement identique � celle qui peut etre contenue par la racine.

    une d�claration de classe peut contenir
    • une collection d'h�ritage
    • une collection d'objet parmis
      • une visibilit� (private, protected, public)
      • une instruction pr� processeur

    une signification de visibilit� peut contenir une collection d'objets parmis
    • une d�claration de classe ou de structure
    • une d�claration ou une d�finition de fonction
    • une instruction preprocesseur
    • une d�claration d'amitie
    • une d�claration de variable

    Enfin, il y a les feuilles et les autres noeuds:
    • Une fonction peut �tre une feuille (si ce n'est que la d�claration) ou un noeud (si c'est aussi la d�finition)
    • une d�claration d'amiti� est une feuille
    • une d�claration de variable est une feuille
    Une fois que tu auras tout cela, tu disposera de l'ensemble de ce qui t'es n�cessaire pour cr�er ton fichier XML...

    Aucune liste n'est exhaustive, certaines choses manquent et c'est � toi de les trouver (o� serait le plaisir, sinon )... Mais une simple "observation" de diff�rents codes sources devrait te permettre d'y arriver
    A m�diter: La solution la plus simple est toujours la moins compliqu�e
    Ce qui se con�oit bien s'�nonce clairement, et les mots pour le dire vous viennent ais�ment. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 f�vrier 2014
    mon tout nouveau blog

Discussions similaires

  1. R�ponses: 10
    Dernier message: 17/01/2012, 17h10
  2. R�ponses: 22
    Dernier message: 29/05/2011, 20h56
  3. R�ponses: 2
    Dernier message: 18/06/2010, 19h12
  4. R�ponses: 3
    Dernier message: 04/07/2009, 14h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo