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 :

Lister les fonctions d'un fichier source


Sujet :

C++

  1. #1
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut Lister les fonctions d'un fichier source
    Bonjour à tous.
    Je souhaite savoir une chose :
    Existe une méthode pour lister toutes les fonctions d'un fichier .cpp ?
    Car pour le moment , pour faire ceci , je pense me tourner vers la lecture du fichier ligne par ligne dans un array de string et ensuite passer chaque case de l'array aux regex suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {template <.*>}? {const}? [a-zA-Z0-9_]+ &? [a-zA-Z0-9_]+(.*) //fonction libre/template libre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {const}? [a-zA-Z0-9_]+ &? [a-zA-Z0-9_]+::[a-zA-Z0-9_]+(.*) {const}? //fonction de classe normale
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    template<.*> {const}? [a-zA-Z0-9_]+ &? [a-zA-Z0-9_]+<.*>::[a-zA-Z0-9_]+(.*) {const}? //fonction classe template
    Pensez vous que j'utilise la bonne méthode ?
    Si oui , est ce que mes regex son correctes ?

    Edit: je sait qu'il manque les destrcuteurs/constructeur mais se sont les plus facile a faire.
    Edit ² :Je vais developper avec wxWidgets.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  2. #2
    Membre éprouvé
    Inscrit en
    Mai 2007
    Messages
    157
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2007
    Messages : 157
    Par défaut
    Si tu fais du c++ je te conseil d'utiliser un vector<std::string>. es-tu sur que une declaration de methode est contenue sur une et une seule ligne?

    Apres tu code sous quelle plateforme, tu fais ceci en console, GUI, ....?

  3. #3
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    Pour info:
    Je vais coder avec wxWidgets.
    Pour lire le fichier , j'utilise wxtextfile.html

    Ensuite pour regexiser , j'utiliserai wxregex

    Es-tu sur que une declaration de methode est contenue sur une et une seule ligne
    Non mais je ne vois pas comment faire si l'expression est définie sur plusieurs ligne am moins que j'écrive mon propre parseur .

    La plateforme serat linux,win et sans doute mac.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  4. #4
    Membre éprouvé
    Inscrit en
    Mai 2007
    Messages
    157
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2007
    Messages : 157
    Par défaut
    Je ne sais pas tres bien comment ca marche mais regarde peut etre du cote de doxygen, le systeme te parse les fichiers ....

    DOXYGEN

    Pas plus d'idées

  5. #5
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    Est ce que lex/yacc (flex/bison) pourrai m'être utile ?
    Car a vrai dire je ne sais pas comment il marche .

    Edit : doxygen ca ne scanne pas que les fichier .h ?
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  6. #6
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Déjà, rien n'oblige une déclaration de fonction à être monoligne. Certains auteurs écrivent

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    template<class T>
    int
    f(
      T t
    )
    {
    }
    Ensuite, selon le contexte,

    Peut être une déclaration de fonction f prenant un argument de type B et retournant un A, ou bien une déclaration de variable f de type A, avec B comme valeur passée au constructeur.

    Donc c'est probablement voué à l'échec de partir sur de simples regex. Il existe des outils (ctags ou etags, je crois) qui font ce genre de chose, et produisent un format de sortie facile à parser.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  7. #7
    Membre émérite
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Février 2004
    Messages
    644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Février 2004
    Messages : 644
    Par défaut
    Une piste si tu ne t'y connais pas en parsing, tu peux utiliser doxygen et lui demander de générer un xml, après tu peux t'amuser avec cet xml.

  8. #8
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    JolyLoic >> Oui mais je veut juste les fonctiosn qui ont leurs definition dans le fichier.
    Ya donc forcement { et } qui vont trainer quelque part.

    swirtel >> Je vais explorer ca.
    Edit : apres exploration de cette voie , c'est un beau bordel pour au final rien du tout.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  9. #9
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    Après d'intensce recherche sur le net , jene trouve rien qui me convienne.
    JE vais donc me faire mon parseur a la main.
    Si vous des idées ou pistes quelconques, je prend .
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  10. #10
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Salut,

    C'est loin d'être un problème simple d'analyser correctement un code C++, il y a énormément d'ambigüités, certaines ne peuvent être levées qu'en construisant une table des symboles pour lister les types par exemple.
    Cela dit suivant ce que tu veux faire des informations que tu extraits tu peux sans doute simplifier un peu, par exemple tu ne parles que des fonctions donc tu peux peut-être déjà jeter un oeil à http://www.gccxml.org ?

    Quel est le but final ?

    MAT.

  11. #11
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    Je ne veut pas analyser tout le code.De plus , je me fiche de la valeur du code.
    Je veut juste réussir a lister toutes les fonctions(fonction libre,constructeurs,fonction de classe 'normale',...) qui ont leurs déclaration dans un fichier cpp.
    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    int A::A(){} //listé
    int A::B() //listé 
    {
    C::foo(); //pas listé
    foo(); //pas listé
    }
    Par la suite , si j'arrive a lister toutes les fonctions souhaité , je veut créer un logiciel permetant une réorganisation graphiques(avec du drag and drop) des fonctions à travers différent fichiers pour éviter du copier coller fastidieux.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    Salut,

    Commence peut etre par réfléchir à la manière dont une fonction est définie:

    [template <[liste template param] >][const] type de retour nomfonction ([liste arguments]) [throw( [liste exception])][const] {

    Le tout, sur un nombre de lignes allant de 1 à

    L'idée est donc *peut être* de ne prendre déjà que ce qui peut se trouver entre une accolade fermante (celle de la fonction précédente ) et une accolade ouvrante

    Le parsing pourrait se faire sur base des éléments suivant:

    • template_declaration: (facultatif)
      • template
      • opening "<"
      • items
      • closing ">"
    • return_typer:
      • cv_qual,
      • nom,
      • indirection
    • func_name:
      • name
      • opening "("
      • func_args:
        • items: tout se qui se trouve entre ( et ), délimité par "," ou par ")"
      • closing ")"
    • throw_info: (facultatif)
      • throw
      • opening "("
        • [*items: tout se qui se trouve entre ( et ), délimité par "," ou par ")"
      • closing ")"
    • cv_qual
    • block_bebin: "{"

    cv_qual pouvant etre au choix "const" ou ""
    indirection pouvant etre au choix "*","**" ou "&"

    Cela pourrait te fournir une idée des classes et des membres qu'il te faudra gérer
    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

  13. #13
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    Commence peut etre par réfléchir à la manière dont une fonction est définie:
    J'y pense mais a chaque fois j'en oublie ou le fait mal.

    L'idée est donc *peut être* de ne prendre déjà que ce qui peut se trouver entre une accolade fermante (celle de la fonction précédente ) et une accolade ouvrante
    Bonne idée mais il faut zapper les commentaires enventuels.
    De plus comment amorcer le processus pour la 1er fonction ?

    template_declaration: (facultatif)
    ...
    cv_qual pouvant etre au choix "const" ou ""
    indirection pouvant etre au choix "*","**" ou "&"
    Merci beaucoup.
    Je devrai pouvoir faire un bon parsing avec ca
    Cela pourrait te fournir une idée des classes et des membres qu'il te faudra gérer
    ?
    Une classe parseur , des struct pour associer fonction/fichier/ligne et c'est tout.

    Edit ; je vien de voir que ton analyse ne couvre pas les méthodes des classes .
    A moins que tu mette le nom de la classe et l'opérateur de résolution longue porté dans le nom de la fonction
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    Oui, au temps pour moi, je considérais l'indicateur de portée comme faisant partie de la fonction, mais, de fait, il peut être mieux de le considérer séparément
    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

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    D'un autre coté, il me semble intéressant de réfléchir à la gestion qui sera faite de la liste des fonctions déclarées...

    Si tu peux te contenter du nom de la fonction, l'indicateur de portée peut être considéré séparément, si, par contre, tu prévois une gestion plus précise (dans une map, par exemple) l'indicateur de portée peut très bien être considéré comme faisant partie du nom (et la liste des arguments peut nécessité d'être prise "dans le nom")
    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

  16. #16
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Citation Envoyé par Davidbrcz
    Après d'intensce recherche sur le net , jene trouve rien qui me convienne.
    Tu as regardé ctags ? C'était quoi le problème avec ?
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    Un autre avantage à considérer l'indicateur de portée comme faisant partie du nom, c'est dans le cadre des fonctions template...

    En effet, la définition prend alors la forme de
    template <[temp_params]> cv-qual returntype deref [scope<[temp_param]>::] funcname([arguments]) [throw(throw_list)]cv-qual{

    Si l'indicateur de portée est considéré comme faisant partie du nom, la liste des paramètres template (celle qui apparait à coté de scope ) en fait tout simplement aussi partie, alors que sinon, cette liste doit faire partie d'une gestion séparée

    Quand au problème de "la première fonction" du fichier, c'est le plus facile à résoudre:

    Fatalement, le parser disposera d'une liste des fonctions qu'il met à jour, et donc:
    • tu vérifie si cette liste contient un élément, si ce n'est pas le cas
      • tu prend tout ce que tu trouve avant la première { (et tu vire les commentaires)
    • sinon
      • tu prend ce qui suit la } de la fonction précédente et qui précède la { suivante (et tu vire les commentaires)
    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

  18. #18
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    JolyLoic >> ctags est bien mais c'est un programme externe.
    Je souhaite tout faire en interne.

    tu vérifie si cette liste contient un élément, si ce n'est pas le cas
    tu prend tout ce que tu trouve avant la première { (et tu vire les commentaires)
    sinon
    tu prend ce qui suit la } de la fonction précédente et qui précède la { suivante (et tu vire les commentaires.
    Bonne idée.
    Et avec la description de la fonction , je vais pouvoir construire une regex qui verifie que c'est bien une fonction.

    HS:koala, c'est pas plutôt Nicolas Boileau et non Francis ?
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    lol... Non... A ma connaissance, c'est Francis qui a dit ca... C'est qui Nicolas
    (maitenant, je peux me tromper )
    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

  20. #20
    Membre émérite
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Février 2004
    Messages
    644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Février 2004
    Messages : 644
    Par défaut
    Citation Envoyé par Davidbrcz
    JolyLoic >> Oui mais je veut juste les fonctiosn qui ont leurs definition dans le fichier.
    Ya donc forcement { et } qui vont trainer quelque part.

    swirtel >> Je vais explorer ca.
    Edit : apres exploration de cette voie , c'est un beau bordel pour au final rien du tout.
    Un beau bordel ? MDR, Doxygen te parse le code C++ sans poser de problèmes et te fournit des XML, maintenant, tu pourrais fusionner tous ces XML en un seul à l'aide d'un XSLT. D'ailleurs, tu as une xslt fournit par doxygen pour le faire.

    Comme tu le dis, c'est un vrai bordel, mais sur un petit bout de code de 500 milles lignes de code, ça aide énormément.

    Tu peux même te faire un graph de dépendances (class, héritage, composition, etc...) même t'amuser à savoir quels sont les headers qui sont utilisés, etc...

    Enfin, pour moi ça fonctionne et ça m'avait pris une heure avec du ruby pour générer ce que je voulais. Suffit de chercher

Discussions similaires

  1. lister les fonctions d'un fichier
    Par NicoO_O dans le forum Langage
    Réponses: 7
    Dernier message: 03/07/2007, 10h51
  2. Lister les fonctions d'une DLL
    Par alexadvance dans le forum Visual C++
    Réponses: 3
    Dernier message: 19/03/2007, 12h19
  3. Réponses: 2
    Dernier message: 05/12/2006, 18h12
  4. Réponses: 2
    Dernier message: 10/05/2005, 10h58
  5. |VB6] Comment Lister les liens vers des fichiers d'une page web
    Par Mayti4 dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 18/01/2005, 18h17

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