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 :

[Lex/Yacc] Analyseur de grammaire


Sujet :

Générateurs de compilateur

  1. #1
    Membre à l'essai
    Étudiant
    Inscrit en
    Novembre 2006
    Messages
    28
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2006
    Messages : 28
    Points : 22
    Points
    22
    Par défaut [Lex/Yacc] Analyseur de grammaire
    bonjour je ne suis pas un pro en lex/yacc et je dois réaliser un analyseur de grammaire qui vérifie les expressions du type ab2 | c* et doit le transformer en
    OU ( ET ( a, 2(b)) , *(c)) on doit donc reconnaître :
    -la concatenation ex: ab et devient ET(a,b).
    -l'alternative ex: a|b et devient OU ( a,b ).
    -répétition ex: a* devient *(a) au sinon avec les chiffres a2 devient 2(a)

    j'ai déjà réalisé les bases lex et yacc pour reconnaître les expressions correctes que voici mais je ne comprends pas pourquoi ça ne marche pas correctement parfois ca marche 10 fois de suite et tout d'un coup paf syntaxe error

    le lex
    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
     
    %{
    #include <string.h>
    %}
     
    chiffre  [0-9]
    lettre     [A-Za-z]
     
    %%
    "*" {return REP;}
    "|" {return OU;}
     
    {chiffre}  {yylval.val =strdup(yytext);  return CHIFFRE;}
    {lettre}     {yylval.val =strdup(yytext); return LETTRE;}
    [ \r\t]   ;
    \$        return 0;
    \n        return *yytext;
    %%
    le yacc
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    %{
    #include <stdio.h>
    #include "avl.h"
    void yyerror (char *msg)
    {
      fprintf(stderr, "%s\n", msg);
    }
    %}
     
     
    %union{
      char* val;
     
    }
     
    %token <val> CHIFFRE 
    %token <val> LETTRE
    %token OU REP
     
    %type <val> instruction
    %type <val> alternative
    %type <val> repetition
    %type <val> concatenation 
     
    %%
     
    programme: instruction '\n' programme {;}
             | instruction '\n' {;}
             ;
     
    instruction: alternative {printf("\n");}
               | error {;}
               ;
     
    alternative: repetition OU alternative {printf("OU (%s,%s)",$1,$3);}
               | repetition {;}
               ;
     
    repetition: repetition REP {printf("*(%s)",$1);}
              | repetition CHIFFRE {printf("%s(%s)",$2,$1);}  
              | concatenation {;}
              ;
     
    concatenation: LETTRE LETTRE {printf("ET(%s,%s)",$1,$2);}
    	  | CHIFFRE {$$=$1;} 
              | LETTRE  {$$=$1;}
              ;
    %%
    int main()
    {
      yyparse ();
      printf ("Fini\n");
    }
    vos conseils et remarques sont les bienvenus
    merci d'avance

  2. #2
    Membre à l'essai
    Étudiant
    Inscrit en
    Novembre 2006
    Messages
    28
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2006
    Messages : 28
    Points : 22
    Points
    22
    Par défaut
    re salut à tous,

    c'est bon je suis arrivé à faire ce que je voulais.
    juste une petite question :


    pour le démarrage du programme j'ai 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
     
     
    programme: instruction '\n' programme {;}
                  | instruction {;}
                   ;
     
    instruction : expression { /*affichage de l'arbre*/;}
           	      | error {;}	
                  ;	
     
    expression : terme '|' expression { /*$$=  arbre binaire */ }
               | terme {$$=$1;}
               ;
    ...
    mais je n'arrive pas a faire afficher syntaxe error en cas d'erreur à répétition
    situation actuel :
    je lance le programme, je tape une mauvaise expression -> affichage syntaxe error, je tape une deuxième mauvaise expression -> aucun affichage et ainsi de suite.

    votre aide et la bienvenue
    a+

Discussions similaires

  1. Lex/yacc avec c# ?
    Par must19 dans le forum C#
    Réponses: 2
    Dernier message: 03/06/2017, 19h52
  2. [Lex/Yacc] Aide traduction des structures de contrôle
    Par pelo68 dans le forum Générateurs de compilateur
    Réponses: 2
    Dernier message: 07/12/2010, 11h26
  3. Grammaire Fortran Lex/Yacc
    Par Hisoka_Hunter dans le forum Générateurs de compilateur
    Réponses: 0
    Dernier message: 05/01/2009, 02h18
  4. visual studio 2005 (c++) et parser generator (lex / yacc)
    Par must19 dans le forum Visual C++
    Réponses: 3
    Dernier message: 26/03/2007, 11h31
  5. [Lex & Yacc] Gestion des ensembles d'entiers
    Par innosang dans le forum Générateurs de compilateur
    Réponses: 7
    Dernier message: 28/11/2005, 20h26

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