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 :

flex/bison: expression régulière


Sujet :

Générateurs de compilateur

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur calcul
    Inscrit en
    Avril 2011
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur calcul
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2011
    Messages : 36
    Par défaut flex/bison: expression régulière
    Bonjour,

    Je cherche à faire tourner un premier programme supposé ultra-simple à l'aide de Flex et Bison.

    Mon problème: Mon expression régulière renseignée dans la première partie du fichier Flex ne fonctionne pas.

    Voici les fichiers Flex, Bison, et le header nécessaires à la compilation de l'executable:

    Le fichier.l,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    %{
    #include "global.h"
    #include "calculatrice.h"
    #include <stdlib.h>
    %}
     
    chiffre	[0-9]
     
    %%
    {chiffre}	return(CHIFFRE);
    "+"			return(PLUS);
    "9"			return(CHIFFRE9);
    %%

    Le fichier.y
    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
    %{
     
    #include "global.h"
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
     
    %}
     
    %token  CHIFFRE
    %token  CHIFFRE9
    %token  PLUS
    %token  FIN
     
    %start Input
    %%
     
    Input:/* Vide */
      | Input CHIFFRE9 { printf ("chiffre 9");}
      | Input CHIFFRE { printf ("chiffre");}
      | Input PLUS { printf ("symbol +");}
      ;
     
    %%
     
    int yyerror(char *s) {
      printf("%s\n",s);
    }
     
    int main(void) {
      yyparse();
    }
    le fichier.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #define YYSTYPE double
    extern YYSTYPE yylval;
    En plus, voici les commandes utiles pour générer l'executable.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    flex fichier.l;
    mv lex.yy.c fichier_lex.c;
    bison -y -d fichier.y;
    mv y.tab.c fichier_yy.c;
    mv y.tab.h fichier.h;
    gcc -c fichier_lex.c;
    gcc -c fichier_yy.c;
    gcc -o calc fichier_lex.o fichier_yy.o -ll -lm;

    Constat: Lorsque je fais tourner l'exécutable, si je rentre un "+" ou un "9", je vais bien faire mon affichage en retour càd "symbol +" ou "chiffre 9". En revanche, si je rentre un chiffre entre 0 et 9, le programme se contente de me renvoyer ce chiffre sans imprimer "chiffre" comme je semble vouloir le faire. La différence entre mes entrées "+" ou "9" et l'ensemble des chiffres de 0 à 9 est que j'ai utilisé une expression régulière pour la deuxième. Cette dernière ne semble pas fonctionner...

    Pourquoi ?

    Merci beaucoup

    Anthony Brézillon

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 484
    Par défaut
    Bonjour,

    Es-tu sûr que le programme que tu nous présentes est exactement le même que celui que tu fais tourner, car chez moi l'expression régulière est bien reconnue. Cela dit, il y a plusieurs imprécisions dans ton programme qui conduiront fatalement à des bugs difficiles à déceler. Par exemple :

    — Il faut mettre les #include <> avant les #include "". Sinon, ce qui est défini dans les seconds risquent de manquer d'information, d'une part, et de perturber ce qui doit l'être dans les premiers, d'autre part ;
    — Les parenthèses après « return » ne servent à rien. Mais ça, ce n'est qu'un détail ;
    — La récursivité à gauche risque de te poser des problèmes un peu plus tard ;
    — "9" est déjà inclus dans [0-9] et, en principe, c'est cette expression qui devrait reconnaître entièrement le chiffre « 9 » et être validée avant l'expression "9". Il faudra que tu permutes ces deux règles quand tu auras résolu ton premier problème.

    Maintenant, le fait de voir apparaître le caractère sans le contenu de ton printf() associé signifie que le lexer est tombé dans son comportement par défaut : aucune règle n'a reconnu ton caractère, il est donc renvoyé tel quel vers la sortie standard sans remonter à Yacc.

    Pourquoi ? Mystère, effectivement.

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur calcul
    Inscrit en
    Avril 2011
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur calcul
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2011
    Messages : 36
    Par défaut
    Merci pour ta réponse.

    J'ai (re)créé l'exécutable de mon côté uniquement à partir des infos que j'ai données dans mon premier message. Il est donc certain que je manipule les même fichiers. Le problème persiste...

    Par la suite, j'ai fait certaines modifs que tu m'as recommandées. Mon expression régulière n'est toujours pas reconnue...

    Utilises-tu les même outils et commandes de compilation que celles que j'ai renseignées dans mon premier message ?

    Anthony

  4. #4
    Membre averti
    Homme Profil pro
    Ingénieur calcul
    Inscrit en
    Avril 2011
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur calcul
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2011
    Messages : 36
    Par défaut
    Autre chose ,

    peut-tu me mailer tes fichiers__yy.c et fichier_lex.c et fichier.h ?

    Peut-être y trouverai-je des différences avec les miens.

    Merci !

    Anthony

  5. #5
    Membre averti
    Homme Profil pro
    Ingénieur calcul
    Inscrit en
    Avril 2011
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur calcul
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2011
    Messages : 36
    Par défaut
    Bonjour,

    Pour étoffer un peu et précisez mon problème: voici un fichier.l aussi simple que le précédent.

    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
    %{
    #include <stdlib.h>
    #include "global.h"
    #include "fichier.h"
    %}
     
    lettre [a-zA-Z]
     
    %%
    {lettre}	return LETTRE;
    {lettre}+	return MOT;
    [0-9]		return CHIFFRE;
    [0-9]+		return NOMBRE;
    "+"			return PLUS;
    r			return R;
    r+			return RR;
    Les CHIFFRE NOMBRE PLUS R et RR sont reconnus sans souci tandis que les LETTRE et MOT ne le sont pas. Voici un exemple d'utilisation du programme:

    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
     
    $ ./calc
    5
    chiffre
     
    45
    nombre
     
    +
    symbole +
     
    p
    p
    fg
    fg
    r
    lettre r
     
    r45rr
    lettre r
    nombre
    multiple lettre r
    Voila, merci d'avance pour votre aide.

    Anthony

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 484
    Par défaut
    C'est très curieux. Quelles versions de flex et de bison utilises-tu ? J'ai pour ma part GNU bison 2.4.1 et flex 2.5.35 (en plus, pour une raison inconnue, ma Fedora 13 ne propose que les versions statiques de liby et libfl).

    Chez moi, ça fonctionne comme attendu. En plus, la lettre R et la suite RR sont reconnus respectivement comme une LETTRE et comme un MOT, si bien que R et RR ne sont jamais atteints, et flex est capable de s'en rendre compte à la compilation.

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

Discussions similaires

  1. [RegEx] Expression régulières : Balises <SCRIPT>
    Par Gwipi dans le forum Langage
    Réponses: 2
    Dernier message: 24/04/2006, 23h25
  2. Expression réguliére
    Par Mad_Max dans le forum Langages de programmation
    Réponses: 2
    Dernier message: 16/09/2003, 18h17
  3. [expression régulière] mon cerveau fait des noeuds..
    Par nawac dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 27/05/2003, 10h06
  4. Expressions réguliéres
    Par Tooms dans le forum Langage
    Réponses: 4
    Dernier message: 06/12/2002, 18h42
  5. Réponses: 5
    Dernier message: 11/06/2002, 15h21

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