Bonjour,
je me permet de reposter ce message car je n'étais pas dans le bon chanel.
Je suis actuellement en train d'essayer de faire un petite compilateur avec flex et bison mais voilà j'ai un problème. Au moment de compiler mon programme, il me sort une erreur
parser.y:56.28-72.1: erreur: «}» manquant en fin de fichier
56 | | ID AFF EXP {if(!ts_retrouver_id(tsymb,$1)){fprintf(stderr,"la variable n'as pas été déclarée");exi…
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
make: *** [makefile:18 : parser.c] Erreur 1
sauf que quand je regarde il ne manque pas de "}" du coup je suppose que l'erreur est autre part mais je ne vois pas OÙ
je vous remercie d’avance pour votre aide
parser.y
voici mes programmes :
lex.lexer
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 %{ #include <stdio.h> #include <ctype.h> #include <unistd.h> #include "asa.h" #include "ts.h" extern int yylex(); ts *tsymb=NULL; %} %union{ int nb; char id[32]; struct asa * noeud; }; %define parse.error verbose %token <nb> NB %token <id> ID %token DEBUT FIN AFFI VAR AFF %type <noeud> EXP INSTS INST %left AFF %left '+' '-' %left '/' '*' '%' %start PROG %% PROG : DEBUT INSTS FIN {codegen($2);printf("\n");} ; INSTS : INSTS INST { $$ = creer_noeudInst($1,$2);} | INST { $$ = $1;} ; INST:EXP ';' { $$ = creer_noeudInst($1,NULL);} | VAR ID ';' {if(tsymb == NULL) tsymb = ts_init_table($2); //si la liste chainee est vide, on l'initialise $$ = ts_ajouter_id(tsymb, $2);} ; EXP : NB { $$ = creer_feuilleNb(yylval.nb); } | EXP '+' EXP { $$ = creer_noeudOp('+', $1, $3); } | EXP '-' EXP { $$ = creer_noeudOp('-', $1, $3); } | EXP '*' EXP { $$ = creer_noeudOp('*', $1, $3); } | EXP '/' EXP { $$ = creer_noeudOp('/', $1, $3); } | EXP '%' EXP { $$ = creer_noeudOp('%', $1, $3); } | '(' EXP ')' { $$ = $2;} | '-' EXP { $$ = creer_noeudUnaire('-',$2); } | ID AFF EXP {if(!ts_retrouver_id(tsymb,$1)){fprintf(stderr,"la variable n'as pas été déclarée");exit(1);} $$=creer_noeudOp('=',$1,$3)//Sauvegarde de la valeur contenue dans l'ACC vers la case pointee par ID;} ; %% int main( int argc, char * argv[] ) { extern FILE *yyin; if (argc == 1){ fprintf(stderr, "aucun fichier fournie\n"); return 1; } yyin = fopen(argv[1],"r"); yyparse(); return 0; }
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 %{ #include <string.h> #include "parser.h" %} %option nounput %option noinput NOMBRE [1-9][0-9]* OPE [+\-*/] PA [()] IDE [a-z][0-9a-z]* BLANC [ \t\n] %% "VAR" { return VAR;} "DEBUT" { return DEBUT; } "FIN" { return FIN; } ";" { return yytext[0]; } "AFFICHER" { return AFFI; } {IDE} { strcpy(yylval.id, yytext); return ID; } "<-" { return AFF; } {NOMBRE} { yylval.nb = atoi(yytext); return NB; } {OPE} { return yytext[0]; } {PA} { return yytext[0]; } {BLANC} { } . { fprintf(stderr, "[err lexer] caractere inconnu %c\n",yytext[0]); return 1;} %%
Partager