Bonjour,
Je suis en train de concevoir un d'analyseur lexical devant accepter l’équivalent de l’opérateur IN en SQL. Ainsi une phrase doit avoir la syntaxe suivante :
- "un_mot.un_mot IN " ou "un_mot IN"
- Suivi d'une parenthèse ouvrante et fermante comprenant une liste de mot entre guillemet séparé par une virgule
Ceci correpond a la ligne 25 du fichier sql.yMon analyseur détecte bien les bonnes des mauvaises phrases, cependant il "bug" toujours de la même manière : si pour CHAMP_NAME je précise une valeur sans point alors c est le contenu des parenthèse qui m'est retourné quand je fait $1 (ligne 26 et 27)
Code : Sélectionner tout - Visualiser dans une fenêtre à part CHAMP_NAME IN PARENTHESEG LISTE_IN PARENTHESED
voici mes 2 phrase de test :Voici intégralité de mes 2 fichiers
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 mot1.mot2 in ("aa", "bb", "cc") mot1 in ("aa", "bb", "cc")
sql.l
sql.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
33
34
35
36
37 %option noyywrap %{ #include "sql.h" #include <stdlib.h> %} chiffre [0-9] entier {chiffre}+ exposant [eE][+-]?{entier} valeur {entier}("."{entier})?{exposant}? variable [a-zA-Z_0-9]+ %% [ \t\n] ("in"|"IN") return IN; "." return POINT; ("\""|"'") return GUILLEMET; "(" return PARENTHESEG; ")" return PARENTHESED; "," return COMMA; {valeur} { yylval.var=(char*)_strdup(yytext); //printf("Valeur found: %s\n", yylval.var); return(VALEUR); } {variable} { yylval.var=(char*)_strdup(yytext); //printf("Variable found: %s\n", yylval.var); return(VARIABLE); }
mon bat pour compiler
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113 %{ #include <stdio.h> #include <stdlib.h> #include <string.h> %} %union { double val; char* var; } // ce que transmet lex %token <var> VALEUR %token <var> VARIABLE IN POINT GUILLEMET %token <var> PARENTHESEG PARENTHESED COMMA // combinaison de plusieur %token %type <var> CHAMP_NAME %type <var> LISTE_IN %start PHRASE; %% PHRASE: CHAMP_NAME IN PARENTHESEG LISTE_IN PARENTHESED{ printf("CHAMP_NAME = %s\n", $1); printf("LISTE_IN = %s\n\n", $4); }; CHAMP_NAME: VARIABLE { strcpy($$, $1); } | VARIABLE POINT VARIABLE { strcpy($$, $1); strcat($$, "."); strcat($$, $3); } ; LISTE_IN : GUILLEMET VARIABLE GUILLEMET { strcpy($$, "\""); strcat($$, $2); strcat($$, "\""); } | VALEUR { strcpy($$, $1); } | LISTE_IN COMMA GUILLEMET VARIABLE GUILLEMET { strcpy($$, $1); strcat($$, ", "); strcat($$, "\""); strcat($$, $4); strcat($$, "\""); } | LISTE_IN COMMA VALEUR { strcpy($$, $1); strcat($$, ", "); strcat($$, $3); } ; %% int yyerror(char *s) { printf("%s\n",s); system("pause"); } int main(void) { int choix = 0; printf("\n1 : saisies au clavier\n"); printf("2 : Analyser le fichier req.txt\n\n"); printf("Votre choix : "); scanf("%d",&choix); printf("\n\n"); if (choix == 2) { FILE *file_IN; char ligne[512]; file_IN = fopen ("req.txt", "r"); if( file_IN != NULL) { while(fgets(ligne, 512, file_IN) != NULL) if(strlen(ligne) > 3) // saute les ligne vide exemple : \n\r\0 { yy_scan_string(ligne); yyparse () ; } fclose(file_IN); } } else if (choix == 1) yyparse(); else printf("\nChoix incorrect\n"); system("pause"); }
J'ai retourné mon code dans tout les sens et je ne trouve pas d’où vient mon erreur. Auriez vous une idée pour corriger ce programme ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 bison --defines=sql.h sql.y -o sql.y.c flex --outfile=sql.lex.c sql.l gcc -c sql.lex.c -o sql.lex.o gcc -c sql.y.c -o sql.y.o gcc -o sql sql.lex.o sql.y.o pause del sql.h del sql.lex.c del sql.lex.o del sql.y.c del sql.y.o
Partager