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

Autres éditeurs Discussion :

[flex/bison] un bout de code svp


Sujet :

Autres éditeurs

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2006
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 112
    Par défaut [flex/bison] un bout de code svp
    Slt ,j'ai comme projet la réalisation d'un compilateur pour un langage proche du pascal, seulement voila je galère pour construire l'analyseur lexical/syntaxique a partir de la grammaire que j'ai.
    Svp est que une bonne âme peut me donner un petit exemple d'un compilateur (même très basique) pour que je puisse avancer un peu.
    Merci bcp.
    NB: j'ai déjà effectué des recherches mais tout ce que je trouve c'est des mini-calculateur tres simple alors que ce que je veux réaliser est bcp plus complexe.
    NB2:je poste mon message ici et dans le forum linux car je ne savais plus ou poster vu qu'il n'y a pas de forum compilation désolé .

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    52
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 52
    Par défaut
    Citation Envoyé par hunter99 Voir le message
    seulement voila je galère pour construire l'analyseur lexical/syntaxique a partir de la grammaire que j'ai.
    C'est la grammaire que tu as qui te pose un problème?

    Tu n'arrive pas à utiliser flex ou bison?

    Essaye d'abord de ne t'occuper que de la grammaire (la partie bison)
    Recopie sans reflechir toutes les regles de grammaire que l'on t'a fourni et les token.
    Il n'y a normalement pas de difficulté.
    les petits exemple que tu as trouvé devraient pouvoir t'aider pour la syntaxe de bison.
    Ensuite il faut règler les conflits, l'étape la plus cool ,

    Une fois que tout fonctionne du coté de bison, passe à flex.
    C'est normalement plus simple (depend des consignes...).

    Ce sont des généralités mais tu ne dis pas ce que tu ne comprends pas et je n'ai pas d'exemples sous la main.

  3. #3
    Membre confirmé
    Inscrit en
    Décembre 2006
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 112
    Par défaut
    tt d'abord merci pour ta reponse, ce qui me pose probleme c'est la creation des tokens et de l'analyseur lexical ,j'ai pas bien saisi aussi la procedure a suivre pour la creation des regles de traduction.

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    52
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 52
    Par défaut
    Un bout de code reduit if/then/else, operations ( "2+3..")

    C'est juste un exemple il manque beaucoup de chose, mais ca peut aider.
    J'ai laissé des conflits, c'est en partie le but de l'exercice.

    cote bisons:
    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
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
     
    //%expect 0
    %error-verbose
    %pure-parser
    %debug
    %locations
    %code requires
    {
    # include <stdio.h>
    # include <stdlib.h>
    # include <errno.h>
    }
    %code provides
    {
      void yyerror (const char* msg);
    # define YY_DECL \
      enum yytokentype yylex (YYSTYPE* yylval, YYLTYPE* yylloc)
      YY_DECL;
      extern FILE* yyin;
    }
    %%
    %token
            IF              "if"
            THEN            "then"
            ELSE            "else"
            NUL             "nul"
            PLUS            "+"
            MINUS           "-"
            STAR            "*"
            DIV             "/"
            EQ              "="
            INF             "<"
            SUP             ">"
            NEQ             "<>"
            INFEQ           "<="
            SUPEQ           ">="
            WHILE           "while"
            FOR             "for"
            TO              "to"
            DO              "do"
            OF              "of"
            BREAK           "break"
            PARSE_EOF 0     "end of file";
    %token <string>
            STRING          "string";
    %token <id>
            ID              "id";
    %token <ival>
            INT             "integer";
    %union
    {
        int         ival;
        char        *string;
        char        *id;
    };
     
     
    //Ajouter les bonnes associativite et priorite pour regler certains conflits
    %left "+" "-";                             // priorite 0 associatif a gauche
    %nonassoc ">" "<" "=";         //priorite 1 non associatif
     
    program:
            exp
     
    exp:
        "integer"
       | "id"
       | "if" exp "then" exp
       | "if" exp "then" exp "else" exp
       | op
       ;
    op:
      exp "+" exp
    | exp "-" exp
    | exp "*" exp
    | exp "/" exp
    | exp "=" exp
    | exp ">" exp
    | exp "<" exp
    ;
     
    %%
    /* Epilogue. */
    void yyerror (const char* msg)
    {
      /* Ajouter affichage d'un message d'erreur */
      printf("%s\n", msg);
      return;
    }
     
    int     main (void)
    {
      unsigned int nerrors = 0;
      // yyin de type FILE*, permet de specifier la source a analyser.
      yyin = stdin;
      yyparse ();
      return nerrors;
    }
    Cote flex :
    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
     
    %{
    # include <stdlib.h>
    # include <errno.h>
    # include <limits.h>
    # include "parsetiger.h"
     
      static void unexpected(const char* s);
    %}
     
    %option nounput noyywrap
     
    %%
    "while"       return WHILE;
    "for"         return FOR;
    "to"          return TO;
    "do"          return DO;
    "of"          return OF;
    "break"       return BREAK;
    "if"          return IF;
    "then"        return THEN;
    "else"        return ELSE;
    "nul"         return NUL;
    "+"           return PLUS;
    "-"           return MINUS;
    "*"           return STAR;
    "/"           return DIV;
    "="           return EQ;
    "<>"          return NEQ;
    "<"           return INF;
    "<="          return INFEQ;
    ">"           return SUP;
    ">="          return SUPEQ;
    [ \t]+      {/*yyloc pour gerer la localisation*/};
    "\n"        { /*yyloc */}
    [a-zA-Z][0-9a-zA-Z_]*   yylval->id = yytext; return ID;
    [0-9]+          yylval->ival = atoi(yytext); return INT;
    .            {unexpected(yytext);/*caractere inatendu, c'est une erreur*/}
     
    %%
    void unexpected(const char* s)
    {
      printf("Unexpected `%s'\n", s);
    }

  5. #5
    Membre confirmé
    Inscrit en
    Décembre 2006
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 112
    Par défaut
    Merci bcp tu m'enleve une epine du pied

  6. #6
    Membre éclairé
    Inscrit en
    Janvier 2007
    Messages
    293
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 293
    Par défaut
    Bonsoir,

    en pièce jointe les fichiers lex et yacc pour un compilateur complet en C que j'avais trouvé sur le net et qui m'ont pas mal aidé pour mon projet.


    EDIT : fichier retiré par manque de place dans mon espace.

Discussions similaires

  1. SVP j'ai besoin d'aide Flex/Bison (urgent)
    Par t_imed dans le forum Linux
    Réponses: 0
    Dernier message: 16/04/2008, 17h06
  2. Besoin d'explications sur un bout de code
    Par zizitop dans le forum C
    Réponses: 7
    Dernier message: 26/04/2005, 14h51
  3. bout de code à dechifrer svp
    Par bball dans le forum C
    Réponses: 32
    Dernier message: 20/01/2005, 23h23

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