IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

flex et bison


Sujet :

C

  1. #1
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2020
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2020
    Messages : 20
    Points : 17
    Points
    17
    Par défaut flex et bison
    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;}
    *
    %%

  2. #2
    Membre averti

    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2012
    Messages
    318
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2012
    Messages : 318
    Points : 355
    Points
    355
    Par défaut
    J'ai peu d'expérience dans ce langage (on est sur le forum C ^^ ) et je me demande si dans le cas d'un branchement conditionnel (if) il est permis de mettre tout sur une ligne... si il y a plus d'une instruction dans le "bloc"...


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    | VAR ID ';'               {if(tsymb == NULL) tsymb = ts_init_table($2); //si la liste chainee est vide, on l'initialise
    ****************************$$ = ts_ajouter_id(tsymb, $2);}
    ...donne l'air de "passer" vu que les instructions sont sur une ligne différente...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    | ID AFF EXP               {if(!ts_retrouver_id(tsymb,$1)){fprintf(stderr,"la variable n'as pas été déclarée");exit(1);}
    ...donne l'air de ne pas "passer" vu que le fprintf() et le exit() sont sur la même ligne...

    Maintenant je ne connais ni Bison ni Flex... uniquement par leurs noms...

  3. #3
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2020
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2020
    Messages : 20
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par hurukan Voir le message
    J'ai peu d'expérience dans ce langage (on est sur le forum C ^^ ) et je me demande si dans le cas d'un branchement conditionnel (if) il est permis de mettre tout sur une ligne... si il y a plus d'une instruction dans le "bloc"...


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    | VAR ID ';'               {if(tsymb == NULL) tsymb = ts_init_table($2); //si la liste chainee est vide, on l'initialise
    ****************************$$ = ts_ajouter_id(tsymb, $2);}
    ...donne l'air de "passer" vu que les instructions sont sur une ligne différente...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    | ID AFF EXP               {if(!ts_retrouver_id(tsymb,$1)){fprintf(stderr,"la variable n'as pas été déclarée");exit(1);}
    ...donne l'air de ne pas "passer" vu que le fprintf() et le exit() sont sur la même ligne...

    Maintenant je ne connais ni Bison ni Flex... uniquement par leurs noms...
    je vous remerci pour votre raiponce effectivement j'étais pas le bon chanel je suis désolée, je vais essayé ce que vous m'avez dit ! merci beaucoup

  4. #4
    Expert confirmé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 442
    Points : 4 602
    Points
    4 602
    Par défaut
    Bonjour,

    A la ligne 56, il manque une accolade fermante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    | ID AFF EXP               { if(!ts_retrouver_id(tsymb,$1)) { fprintf(stderr,"la variable n'as pas été déclarée"); exit(1); }
    Au lieu de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    | ID AFF EXP               { if(!ts_retrouver_id(tsymb,$1)) { fprintf(stderr,"la variable n'as pas été déclarée"); exit(1); } }
    Salutations

Discussions similaires

  1. aide lex et yacc/flex et bison
    Par wasdaka dans le forum Autres éditeurs
    Réponses: 7
    Dernier message: 02/12/2008, 20h24
  2. flex et bison
    Par awabi dans le forum Autres éditeurs
    Réponses: 0
    Dernier message: 26/11/2008, 12h51
  3. Pour tous les experts Flex et Bison
    Par sabri_icone dans le forum Linux
    Réponses: 1
    Dernier message: 09/01/2008, 15h26
  4. Interfacer Flex et Bison
    Par minirop dans le forum Flex
    Réponses: 4
    Dernier message: 15/11/2006, 23h14
  5. Flex et Bison avec Visual
    Par kiroukou dans le forum MFC
    Réponses: 16
    Dernier message: 16/05/2006, 14h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo