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
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 %{ #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; %%
vos conseils et remarques sont les bienvenus
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"); }
merci d'avance
Partager