Partage
  • Partager sur Facebook
  • Partager sur Twitter

interfacer bison et flex

    2 novembre 2006 à 16:49:38

    bonjour,
    je n'ai pas trouvé comment interfacer flex et bison car dans le manuel bison, c'est à nous de coder la fonction yylex() (comme ici)

    faut il créer deux fichiers .y (un pour bison et un pour flex) puis créer un fichier .c contenant simplement :
    int
    main( int argc, char **argv )
    {
        return yylex();
    }

    et compiler les 3 fichiers ensemble ? (bien entendu)

    merci.

    edit : et si quelqu'un pouvait m'expliquer comment ils coopèrent (qui appelle qui et quand)
    • Partager sur Facebook
    • Partager sur Twitter
      2 novembre 2006 à 19:13:15

      Hum, tu devrais lire les liens marqués "Online manual" de cette page : http://dinosaur.compilertools.net/.

      Que je me souvienne, lex (flex) génère une fonction yylex qui peut être directement utilisée par yacc (bison), et voilà, quoi d'autre ?
      • Partager sur Facebook
      • Partager sur Twitter
        2 novembre 2006 à 19:24:35

        je me suis déjà bouffé les deux manuels.
        Ce que j'arrive pas à comprendre c'est comment et quand yyparse() appelle yylex().
        car si je fais un truc simple :
        fichier bison.y
        /* Reverse polish notation calculator. */

        %{
        #include <stdio.h>
        #include <ctype.h>
        #define YYSTYPE double
        #include <math.h>
        int yylex (void);
        void yyerror (char const *);
        %}

        %token NUM

        %% /* Grammar rules and actions follow. */
        input: /* empty */
        | input line
        ;

        line: '\n'
        | exp '\n' { printf ("\t%.10g\n", $1); }
        ;

        exp: NUM { $$ = $1; }
        | exp exp '+' { $$ = $1 + $2; }
        | exp exp '-' { $$ = $1 - $2; }
        | exp exp '*' { $$ = $1 * $2; }
        | exp exp '/' { $$ = $1 / $2; }
        /* Exponentiation */
        | exp exp '^' { $$ = pow ($1, $2); }
        /* Unary minus */
        | exp 'n' { $$ = -$1; }
        ;
        %%
        void
        yyerror (char const *s)
        {
        fprintf (stderr, "%s\n", s);
        }

        int
        main (void)
        {
        return yyparse ();
        }

        et flex.yy
        %{
        /* C code to be copied verbatim */
        #include <stdio.h>
        %}

        /* This tells flex to read only one input file */
        %option noyywrap

        %%
        . { printf("%s",yytext); }
        %%
        // null !

        et que je compile çà me sort ce que je rentre et le code de bison ne semble pas interprété (c'est comme si il n'y avait que flex). Et si je ne compile que Bison, çà marche.

        Donc bison appelle yylex sur chaque token ?
        • Partager sur Facebook
        • Partager sur Twitter
          2 novembre 2006 à 19:40:46

          C'est... un peu normal. Ton yylex ne retourne rien du tout. En fait tu te contente de faire un printf.

          De ce que je me rappelle, yacc va appeler yylex pour obtenir le prochain token, et yylex va renvoyer la nature de ce token. Si tu ne renvoies rien... ce n'est pas bon. :p
          • Partager sur Facebook
          • Partager sur Twitter
            2 novembre 2006 à 19:44:02

            oki merci ;)
            çà marche pas encore mais je continues à chercher
            • Partager sur Facebook
            • Partager sur Twitter

            interfacer bison et flex

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown