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