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

Générateurs de compilateur Discussion :

[Parser] Oui mais des conseils ?


Sujet :

Générateurs de compilateur

  1. #1
    Membre confirmé
    Inscrit en
    Août 2004
    Messages
    556
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 556
    Points : 588
    Points
    588
    Par défaut [Parser] Oui mais des conseils ?
    Coucou,

    Je dois faire un logiciel, sous Windows, qui en fait... Bon, j'explique.
    Nous avons des fichiers, sous divers formats, qui doivent suivre une certaine nommenclature.

    Ce que fait le logiciel est simple: on importe les fichiers dans le logiciel, et le logiciel doit vérifier si les fichiers sont correctement nommés.

    Cependant, du la variation des variables dans le nommage (des codes, du type de contenu, etc), j'ai assez difficile à créer un Parser correct.

    La nommenclature est déjà là, je ne peux pas la changer, je dois créer un soft capable de parser ces noms, et de dire ceux qui sont nommés de manière incorrecte.

    Le nommage s'effectue selon un schéma déjà défini:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    FFFFXAX_X_F...F_T...T_A_AX.ext
    F = Falcultatif, mais peut très bien être là. Sachant que si le premier facultatif est là, ben le reste des facultatifs doit être aussi présent.
    A = Lettre
    X = Chiffre
    T...T = Type, longueur indéfinie. Alpha-numérique.
    F...F = Totalement facultatif, ce sont des détails.

    ext = extension.

    J'utilise principalement des std::string pour mes logiciels. Mais là, je vois pas trop comment, sachant que je n'ai encore pas vraiment fait de parsing.

    Vala vala, des conseils pour commencer, des erreurs à ne pas faire ?
    Car bon, substr, c'est bien, mais moi, je n'ai aucune information sur la longueur de chaque segment :\

    Pensez-vous qu'un "explode" serait secure ? (comme la fonction PHP, c'est à dire créer un tableau où chaque entrée est un segment précédé ou suivi d'un token donné, tel que dans notre cas par exemple, ce token serait '_')

    Le problème est au niveau de la vérification des données. En effet, vu que certains segments contiennent nombres ET lettres, surtout que je ne peux pas savoir combien de chiffres il y a (à part vérifier la longueure totale du segment, mais bon, vraiment), comment je fais pour différencier une lettre d'un chiffre dans un string ? A part en essayant de convertir chaque caractère vers un short int mais trop fastidieux, je suis sûr que quelque chose de mieux existe).

    En vous remerciant d'avance,

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Je ne connais pas explode, mais je conseille en effet de séparer le nom selon les underscores, et d'analyser à partir de là.

    En C, on peut utiliser les fonctions de <ctype.h> (comme isdigit()) pour savoir si un caractère est un chiffre. En C++, je ne sais pas.

    Sinon, sur tous les jeux de caractères ASCII ainsi que l'EBCDIC, tu peux vérifier ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if(carac >= '0' && carac <= '9')
    {
        //carac est un chiffre.
    }
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Bonjour,

    pour ce genre de problème, utiliser les fonctions de recherches sur les chaînes de caractères risque de demander beaucoup de travail.

    Tu peux utiliser les expressions régulières si la syntaxe est simple mais elles ne sont prévues pour faire de l'annalyse lexicale (ça risque de coincer au niveau des tokens F).

    Le plus simple, est de construire une grammaire et d'utiliser (par exemple, n'ayant jamais tester, il y a peut être mieux) boost::spirit.

  4. #4
    Membre confirmé
    Inscrit en
    Août 2004
    Messages
    556
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 556
    Points : 588
    Points
    588
    Par défaut
    Merci pour ces réponses, je vais voir du côté de boosts::spirit, bien que je n'ai jamais utilisé les librairies boosts

    Bref, je m'édit dès que j'ai du nouveau !

  5. #5
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Février 2006
    Messages
    943
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 943
    Points : 1 156
    Points
    1 156
    Par défaut
    Je pense que tu peux faire plus simple.
    F est une lettre ou un chiffre ou les deux ?
    de toute facon tu doit pouvoir decouper ta chaine assez simplement.
    Par exemple si le 4eme elem est un token alors tu n'as pas d'elements facultatif, ... etc

    Je pense qu'un algo sur les chaines peut te suffir.

    http://www.boost.org/doc/html/string_algo.html

  6. #6
    Membre averti
    Homme Profil pro
    Game Graphics Programmer
    Inscrit en
    Août 2006
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Game Graphics Programmer
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 408
    Points : 392
    Points
    392
    Par défaut
    Vu la norme, je dirais que ce serait faisable avec des expressions régulières.

    Puis, est-ce que tu es limité à C++ pour on programme?
    Vu que tu sembles connaîtres PHP, tu pourrais écrire la vérification dans un script PHP (ou Perl), avec tous les avantages au niveau de traitement de chaînes de charactéres que ces languages offrent, et invoquer ce script à partir du programme. Ce n'est qu'une idée rapide, ceci dit.

  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
    Parmi les parser connus en C++ :
    - Lex/Yacc, surtout dans la verison Flex/Bison : L'ancêtre.
    - Antlr
    - Boost::spirit

    Ce dernier me semble bien approprié pour des petits parseurs (ce qui est ton cas), mais demande une bonne maîtrise du C++ (template metaprogramming -> code élégant, mais pas forcément aisé à débugger).
    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
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Les regexes me semblent suffisantes.
    Boost ftw

  9. #9
    Membre confirmé
    Inscrit en
    Août 2004
    Messages
    556
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 556
    Points : 588
    Points
    588
    Par défaut
    Boost::spirit semble être ce que je cherchais

    Je vous remercie tous

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] Des IF, des IF, oui mais des AND aussi !
    Par Shennong dans le forum VB.NET
    Réponses: 6
    Dernier message: 11/10/2014, 15h12
  2. Des dates, des dates oui mais des Panzanis
    Par bonuxis dans le forum Servlets/JSP
    Réponses: 7
    Dernier message: 29/07/2009, 17h27
  3. Bac + 5 … oui mais pourquoi ? des réponses
    Par Merfolk dans le forum Etudes
    Réponses: 38
    Dernier message: 31/12/2008, 02h02
  4. Des fibres ? Oui, mais pourquoi faire ?
    Par mchk0123 dans le forum Windows
    Réponses: 2
    Dernier message: 01/05/2007, 21h05
  5. [parsers] DOM/SAX:oui mais moi je fais du XSL
    Par luta dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 24/05/2006, 19h10

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