flex et bison compilateur
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:
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:
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;}
%% |