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 :

Mini analyseur de texte


Sujet :

Générateurs de compilateur

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2012
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2012
    Messages : 59
    Points : 10
    Points
    10
    Par défaut Mini analyseur de texte
    Bonjour

    dans le cadre d'un petit projet perso j'aurai besoin de programmer un mini analyseur de texte.
    Dans le programme on doit pouvoir entrer une chaine de texte...
    codé suivant une codification simple mais précise.

    Par exemple si on entre "A(B)2" cela doit générer en sortie "ABB" ...les parenthèses et le "2" donne le nombre de répétitions
    Autre exemple "A((B)2C)2 en sortie o aura "ABBCBBC"

    A noter que pour l'instant cette codification n'est pas encore totalement figée et pourrait évoluer suivant vos réponses
    il y a peut être une codification plus "lisible"...comme dans lex peut être...
    il ne devrait y avoir je pense que la notion de répétition...
    peut être en plus faudrait il une notion de symétrie du style "ABCCBA" mais je ne vois pas trop comment la codifier...donc à voir...

    Donc j'avais pensé me tourner vers lex et yacc... j'en ai un peu fait mais il y a très longtemps...vraiment très longtemps...
    c'est peut être aussi utiliser un canon pour tuer une mouche... je n'ai pas assez de recul pour dire si c'est le bon choix...

    A ce stade je recherche des idées...des pistes...
    il existe peut être une autre voie...

    j'attends vos réponses
    D'avance merci

    Fred

  2. #2
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Ca ressemble à une expression régulière.
    Si tu veux le coder à la main, l'idée principale, c'est qu'une telle chaine est constitué de deux choses:
    1. des segments de lettres, tels que AAB
    2. un enchainement de segments, comme .(.)2(.)((.)2.)4


    Il y a au moins deux structures à définir:
    le segment, qui contient assez d'information pour représenter un segment de taille arbitraire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    typedef struct segment {
        char* valeur;
    } segment;
     
    segment creer_segment(const char*);//strlen, malloc, strcpy
    segment copier_segment(segment const*);
    void détruire_segment(segment);//free de .valeur
    Vient ensuite une structure qu'il faut penser soigneusement, pour représenter la structure.
    Tu remarqueras qu'il y a deux constructions: la séquence et la répétition.

    Je pense qu'il faut définir la chaine de commande comme un emboitement récursif de séquences et de répétition.
    Il faut bien s'arreter à un moment, je suggère qu'une répétition ne concerne que des séquences
    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
    typedef struct sequence sequence;
    typedef struct repetition {
        sequence seq; //pointeur?
        unsigned int n;
    } repetition;
     
    struct sequence {
        union {segment, repetition} contenu;
        enum {sequence_simple, sequence_complexe} est_simple;
        sequence * suite
    };
     
    sequence* creer_sequence_simple(segment);
    sequence* creer_sequence_complexe(repetition);
    void enchainer_sequence(sequence*, sequence*);
    void detruire_sequence(sequence*);//libère toute la séquence, mais laisse à l'utilisateur de la fonction le soin de mettre le pointeur à NULL.
    Reste à coder une première fonction sequence* analyser_format(const char*) pour transformer (et valider) la chaine de controle fournie par l'utilisateur.

    Si tu envisage explicitement de n'avoir jamais deux lettres cote à cote dans la commande (c'est dommage), tu peux te passer de segment, et utiliser un simple char à la place.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  3. #3
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Si ton besoin s'arrête là, tu devrais chercher une bibliothèque d'expressions régulières, comme décrite par exemple dans cet article de Nicolas Joseph.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  4. #4
    Membre émérite
    Homme Profil pro
    sans emploi
    Inscrit en
    Janvier 2014
    Messages
    539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2014
    Messages : 539
    Points : 2 601
    Points
    2 601
    Par défaut
    Bonsoir,

    Cela ressemble aussi à une simple calculatrice. Notons :

    • + l'opérateur de concaténation
      "A" + "B" = "AB"
    • * l'opérateur de répétition
      "A" * 4 = 4 * "A" = "AAAA"
    • rev() la fonction d'inversion
      rev("ABC")="CBA"
    • ... tout ce que tu peux imaginer ... head, tail, split, count, ...


    Ce que tu écris comme : A((B)2C)2
    deviendrait : A + 2 * ( B + 2 * C ) = A + 2 * (B + CC) = A + 2 * BCC = A + BCCBCC = ABCCBCC
    deviendrait : A + 2 * ( 2 * B + C ) = A + 2 * (BB + C) = A + 2 * BBC = A + BCCBCC = ABBCBBC


    La grammaire se formalise aisément et une implémentation peut se faire simplement avec le couple flex/bison. De souvenir il y a un exemple de calculatrice simple dont tu pourrais t'inspirer.

    edit : désolé, j'ai mal interprété ton expression ... comme quoi il vaut mieux utiliser un parser ^^

  5. #5
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2012
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2012
    Messages : 59
    Points : 10
    Points
    10
    Par défaut
    Bonsoir

    effectivement je n'avais pensé à l'aspect "mathématique" du formalisme...
    et donc cela ressemble à une calculette
    bien vu

    je vais fureter un peu sur google...

    Merci déjà...
    si quelqu'un a d'autres idées, je suis preneur

    Fred

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bien le bonsoir,

    Pour apporter ma petite pierre à l'édifice, qui vaut ce qu'elle vaut...

    Pourquoi ne pas passer par un arbre binaire ? C'est typiquement le genre de cas dans lequel on peut aisément les utiliser.

    On construit l'arbre en parcourant récursivement la chaîne de caractère. Une fois celui-ci construit, "il suffit" de repasser dessus récursivement pour en calculer la chaîne finale.

    En prenant l'équation A((B)2C)2 donné en exemple, cela donnerait un arbre binaire du genre :

    Nom : testarb.jpg
Affichages : 208
Taille : 27,9 Ko

    Qui, une fois reconvertis, donnerait bien ABBCBBC.
    Dernière modification par Invité ; 27/03/2015 à 15h19. Motif: orthographe

Discussions similaires

  1. [À télécharger] un mini-editeur de texte
    Par SfJ5Rpw8 dans le forum Vos téléchargements VBScript
    Réponses: 7
    Dernier message: 29/08/2013, 12h49
  2. mini traitement de texte
    Par laurentSc dans le forum Langage
    Réponses: 12
    Dernier message: 31/07/2011, 12h12
  3. mini editeur de texte
    Par gentelmand dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 26/02/2007, 21h00
  4. Réponses: 2
    Dernier message: 30/12/2006, 19h21
  5. Réponses: 1
    Dernier message: 24/09/2006, 10h35

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