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 :

lib parsing c++ personnalisable


Sujet :

C++

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 33
    Points : 23
    Points
    23
    Par défaut lib parsing c++ personnalisable
    bonjour,
    j'ai cherché un peu et pas trouvé ce que je cherche. (pas sûr d'etre sur le bon fofo d'ailleur, hésitez pas a bouger le sujet dans une autre section)

    je cherche une lib pour parser un fichier c++, et récup ce qui se trouve a proximité de certains mots clés (définis par moi-même).
    exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    override char* teststr = "hello test string";
     
    override int test(int* a)
    {
        *a = (*a) + 2;
        return *a;
    }
    je parse le fichier, et je récupère la ligne ou le "override" (nouveau keyword) se trouve, le nom, type, arguments, ect ... de la fonction qui suit.

    idéalement une lib écrite en c++, mais .net marcherais aussi.
    Je précise que ce n'est pas un compiler-compiler que je cherche, juste une lib pour faire ca rapidement, sans se casser la tête.

    l'idée c'est d'avoir une lib conforme aux spec (c++ 11 si possible, dans le pire des cas juste C), que je puisse ensuite parser des fichiers de 2000 lignes sans bug, pour ensuit modif éventuellement et compiler derrière.

    certains vont me dire "s'facile moi j'ai fait un analyseur syntaxique full conforme aux spec du c++ 11 en 5h "... baaaah... respect, moi je peux pas ^^

    Si quelqu'un a une idée, des conseils partagez les

    merci

  2. #2
    Membre chevronné Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Points : 2 160
    Points
    2 160
    Par défaut
    Bonjour

    Tu peux regarder du coté de clang : API, parser.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 33
    Points : 23
    Points
    23
    Par défaut
    plop,

    merci pour ta réponse, désolé de répondre moi meme si tard, je bossais sur autre chose.
    ouais, en fait j'avais déjà survolé clang et j'espérais ne pas avoir à l'utiliser car à ce que j'ai vu ca m'a quand meme l'air assez complexe, ya pas de binaries pour windows, donc faudrait que je le recompile avec la bonne version du VC++ runtime, ect...
    bref, j'ai essayé de le compiler 30min en suivant les conseils du site (http://clang.llvm.org/get_started.html), et vu que j'ai pas réussit (erreurs de script python) j'ai laché l'affaire.

    Je suis tombé sur VCCodeModel dans l'extensibility visual studio, et je me suis dit que ca pouvait peut etre faire ce que je voulais (à la base mon projet est un plugin visual studio).
    Et ca aurait évité de se retrouver avec des prob de compatibilité que j'aurais eu avec Clang (genre "predefined macro" de visual studio pas déclarées, ect...).
    Mais de toutes facons, si j'utilise un nouveau keyword, visual studio le reconnaitras pas, donc le parsing du fichier sera innutilisable.
    et si je déclare un define (ex: #define override ) le parser ignorera juste le mot clé, et je ne pourrais pas le récupérer.

    J'ai mit un message sur les fofo de microsoft et j'ai pas eu de réponse concluante, en fait je parie que l'extensibility de VS est tellement complexe que meme eux comprennent pas bien comment ca marche

    bref, du coup j'ai pas vraiment de piste... je peux ré-essayer de compiler clang mais je vais me retrouver avec des prob de compatiblité et je sais pas si j'arriverais à quoi que ce soit...

    qu'est ce qu'il faut pas faire pour rajouter juste un mot clé

    si quelqu'un a une idée, piste, conseil ou quoi que ce soit, ou veut des clarifications concernant le problème hésitez pas.

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 113
    Points : 32 960
    Points
    32 960
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    pourquoi vouloir parser les fichiers en C++ à tout prix ?
    En Python, c'est l'affaire de 5mn de faire un script qui récupère les lignes qui contiennent override (ou tout autre regexp d'ailleurs)
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 33
    Points : 23
    Points
    23
    Par défaut
    yop,
    pas de Python, ça oblige a l'installer, mais .net oui (cf 1er message), c'est pas très important

    En Python, c'est l'affaire de 5mn de faire un script qui récupère les lignes qui contiennent override (ou tout autre regexp d'ailleurs)
    oui mais non.

    faut parser TOUT le fichier, a cause des multiline comment, des quotes (string),
    des defines, include, continuation de ligne, ect..
    il se passe quoi si tu fais ça :
    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
     
    // fichier1.h
     
    #define override_func(type, name) \
        __declspec( naked ) override type name () \
        { \
            __asm pusha;
     
    #define end_override_func(retvalue) \
        __asm { \
            popa \
            mov eax, retvalue \
            ret \
        } }
     
    // fichier1.cpp
     
    #include "fichier1.h"
     
    override_func(int, functest1)
        printf("hello");
    end_override_func(0)
    Je ne sais même pas si ça compile, ni même si les conventions d'appel sont correctes, j'ai écris ça vite fait... mais l'idée est là, mon appli ne DOIT pas planter.

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 113
    Points : 32 960
    Points
    32 960
    Billets dans le blog
    4
    Par défaut
    Y'a une différence entre ton "problème" initiale qui est
    je parse le fichier, et je récupère la ligne ou le "override" (nouveau keyword) se trouve, le nom, type, arguments, ect ... de la fonction qui suit.
    Où un langage de script sera bien plus simple à mettre en place.

    Et vérifier qu'un fichier est compilable, auquel cas... il suffit d'essayer de le compiler.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  7. #7
    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 : 49
    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
    Points : 16 213
    Points
    16 213
    Par défaut
    Si tu veux analyser du code C++ correct, je te conseille vraiment de creuser un peu plus la solution Clang. La compilation avec VC++ n'est pas difficile (je crois même qu'on trouve des pré-compilés sur le net), il comprend désormais assez bien les particularités de ce compilateur, rechercher un pattern de code assez simple s'écrit littéralement en 5 lignes, et il possède un framework de réécriture de code.

    J'ai mis moins d'une journée à faire une tâche similaire à celle là (pas de réécriture en sortie), découverte de clang comprise.

    Si tu veux développer une sorte d'extension du langage (ton exemple avec override sur une fonction libre me fait supposer ça), ce sera un peu moins simple, tu ne pourras pas simplement utiliser Clang, il te faudra le modifier. Mais l'utilisation de Clang me semble quand même une bonne option à considérer.

    Maintenant, si tu veux faire des modifs très simples, qui n'ont pas besoin de comprendre la structure du code, et que ce qui t'embête, c'est juste le préprocesseur, tu peux peut-être effectuer tes modifs sur le fichier préprocessé ?
    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.

  8. #8
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 33
    Points : 23
    Points
    23
    Par défaut
    Maintenant, si tu veux faire des modifs très simples, qui n'ont pas besoin de comprendre la structure du code, et que ce qui t'embête, c'est juste le préprocesseur, tu peux peut-être effectuer tes modifs sur le fichier préprocessé ?
    ah ouais.... chouette idée. ca me plait
    je crois que je vais faire ca. je chope les fichier préprocessés, je trouve les override, je stocke les infos qu'il me faut, et je les enlève puis je compile les fichiers.

    ca enlève un bon problème déja... mais après on en revient au meme point..

    en fait le truc c'est que si j'autorise du c++, faut que je parse tout, les namespaces, classes, typedef à cause du name mangling car je veux le nom du symbole dans le fichier .obj qui va résulter. (voir http://en.wikipedia.org/wiki/Visual_..._name_mangling)

    et pfff... en fait je crois que ya pas d'interet pour ce que je veux faire.

    Donc je pense que je vais juste faire un petit parser a la main rapidos, juste pour récupérer les override. Vu que ya pas de name mangling en C, j'obligerais l'utilisateur a mettre un "extern "C"" sur sa fonction mais c'est gérable je pense

  9. #9
    Membre expérimenté Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Points : 1 396
    Points
    1 396
    Par défaut
    Salut,

    Juste par curiosité, peux-tu nous dire pourquoi tu veux ajouter ce genre de mot clé ?

  10. #10
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 33
    Points : 23
    Points
    23
    Par défaut
    mouais,

    je me fais un linker un peu spécial qui bidouille des .obj et .exe,
    donc j'ai besoin de rajouter certains (pour le moment 1 seul) mot clé pour certaines fonctionnalités.

    Ici le "override" (renommé en autre chose d'ailleur puisque override est déja reservé pour c++ 11 ou 14 il me semble) est sensé indiquer le remplacement d'une fonction déjà existante pour faire le lien entre les différentes parties du code.
    Comme je sais pas bien ou en sont les règles du fofo je vais m'arréter la pour pas me faire taper sur les doigts.

Discussions similaires

  1. Personnaliser un rapport d'erreur sous Windows XP
    Par Neilos dans le forum Windows
    Réponses: 5
    Dernier message: 21/11/2003, 18h13
  2. [FLASH MX2004] Personnaliser les scrollbars
    Par stephane eyskens dans le forum Flash
    Réponses: 10
    Dernier message: 09/10/2003, 12h53
  3. Chargement d'une lib partagée C++ dans un programme C
    Par Zero dans le forum Autres éditeurs
    Réponses: 4
    Dernier message: 30/09/2003, 16h40
  4. [VB6] [UserControl] Évènements personnalisés
    Par Frankywinky dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 27/05/2003, 17h56
  5. inclure une librairie *.lib
    Par darkbm dans le forum C
    Réponses: 2
    Dernier message: 16/12/2002, 22h48

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