Bonjour,

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 *


voici mes programmes:
parser.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
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;
}

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
%{
#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;}
*
%%