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 :
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;}
 
%%