66 votes

Comment compiler les fichiers LEX/YACC sous Windows ?

Je suis en train d'avoir Lex y YACC pour analyser mes fichiers ( .l et .y ).

Comment compiler ces fichiers et comment en faire des équivalents ? .c pour eux dans la plateforme Windows ?

120voto

Dr Beco Points 1668

À ce jour (2011-04-05, mis à jour 2017-11-29), vous aurez besoin des dernières versions de :

  1. flex-2.5.4a-1.exe

  2. bison-2.4.1-setup.exe

  3. Après cela, faites une installation complète dans un répertoire de votre choix. sans espaces dans le nom . Je suggère C:\GnuWin32 . Faites no l'installer dans le par défaut ( C:\Program Fichiers (x86) \GnuWin32 ) car bison a des problèmes avec les espaces dans les noms de répertoire, sans parler des parenthèses.

  4. En outre, envisagez d'installer Dev-CPP dans le répertoire par défaut ( C:\Dev-Cpp )

  5. Après cela, définissez la variable PATH pour inclure les répertoires bin de gcc (en C:\Dev-Cpp\bin ) y flex\bison (en C:\GnuWin32\bin ). Pour ce faire, copiez ceci : ;C:\Dev-Cpp\bin;C:\GnuWin32\bin et l'ajouter à la fin de l'élément PATH variable, définie à l'endroit indiqué par cette figure :
    step-by-step to set PATH variable under Win-7.
    Si la figure n'est pas en bonne résolution, vous pouvez voir un étape par étape ici .

  6. Ouvrez une invite, allez dans le répertoire où se trouvent vos ".l" et ".y", et compilez-les avec :

    1. flex hello.l
    2. bison -dy hello.y
    3. gcc lex.yy.c y.tab.c -o hello.exe

Commands to create lexical analyzer, parser and executable.

Vous serez en mesure d'exécuter le programme. J'ai fait les sources pour un test simple (l'infâme Hello World ):

Bonjour.l

%{

#include "y.tab.h"
int yyerror(char *errormsg);

%}

%%

("hi"|"oi")"\n"       { return HI;  }
("tchau"|"bye")"\n"   { return BYE; }
.                     { yyerror("Unknown char");  }

%%

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

int yywrap(void)
{
   return 0;
}

int yyerror(char *errormsg)
{
    fprintf(stderr, "%s\n", errormsg);
    exit(1);
}

Bonjour.y

%{

#include <stdio.h>
#include <stdlib.h>
int yylex(void);
int yyerror(const char *s);

%}

%token HI BYE

%%

program: 
         hi bye
        ;

hi:     
        HI     { printf("Hello World\n");   }
        ;
bye:    
        BYE    { printf("Bye World\n"); exit(0); }
         ;

Modifié : éviter "warning : implicit definition of yyerror and yylex".

Avertissement : rappelez-vous, cette réponse est très ancienne (depuis 2011 !) et si vous rencontrez des problèmes en raison de l'évolution des versions et des fonctionnalités, vous aurez peut-être besoin de plus de recherche, car je ne peux pas mettre à jour cette réponse pour refléter les nouvelles itens. Merci et j'espère que ce sera un bon point d'entrée pour vous comme il l'a été pour beaucoup.

Mises à jour : si quelque chose (vraiment de petits changements) doit être fait, veuillez consulter le dépôt officiel sur github : https://github.com/drbeco/hellex

Bon piratage.

0 votes

bison -dy hello.y ne produit aucun fichier. Il affiche juste quelques codes dans l'invite. Comment puis-je créer le fichier y.tab.c ?

0 votes

@Pramodh C'est étrange... Quels sont les codes qu'il affiche ? Des codes d'erreur ? Ou un code source ?

0 votes

J'ai effectué cette procédure dans 2 machines différentes maintenant, et les deux fonctionnent. Êtes-vous sûr d'avoir bien suivi toutes les étapes de la procédure ? Dans la capture d'écran de l'invite de commande ci-dessus, avez-vous obtenu le même écran pour flex (pas d'erreurs) ? Lorsque vous appuyez sur <enter> après avoir tapé la touche bison -dy hello.y commande, ce qui exactly que vous avez ? Si vous donnez des détails exacts, nous pourrons peut-être comprendre le problème. Si vous pensez que c'est trop pour un commentaire vous pourriez peut-être poser une question avec l'erreur.

13voto

Jerry Coffin Points 237758

Ce que vous voulez (probablement), c'est Flex 2.5.4 (certaines personnes le "maintiennent" maintenant et produisent nouvelles versions mais, à mon avis, ils ont davantage contribué à le gâcher qu'à corriger ses véritables défauts. byacc 1.9 (de même). (Edit 2017-11-17 : Flex 2.5.4 n'est plus disponible sur Sourceforge, et le dépôt Flex github ne remonte qu'à 2.5.5. Mais vous pouvez apparemment encore l'obtenir à partir d'un serveur ftp Gnu à l'adresse suivante . ftp://ftp.gnu.org/old-gnu/gnu-0.2/src/flex-2.5.4.tar.gz .)

Puisqu'il sera inévitablement recommandé, je préviens contre en utilisant Bison. Bison a été écrit à l'origine par Robert Corbett, le même type qui a ensuite écrit Byacc, et il déclare ouvertement qu'à l'époque il ne savait pas vraiment ou ne comprenait pas ce qu'il faisait. Malheureusement, étant jeune et stupide, il l'a publié sous la GPL et maintenant les fans de la GPL le présentent comme la réponse aux maux de la vie, même si son propre auteur dit essentiellement qu'il devrait être considéré comme un produit de test bêta -- mais selon le raisonnement alambiqué des fans de la GPL, la licence de Byacc n'a pas assez de restrictions pour être qualifiée de "libre" !

0 votes

Jerry, avez-vous un lien vers la déclaration de Corbett selon laquelle, à l'époque, il ne savait pas vraiment ou ne comprenait pas ce qu'il faisait ? Merci.

0 votes

@RayHulha : désolé, mais je n'ai pas de lien sous la main.

10voto

lesmana Points 8125

Il y a des ports de flex et bison pour Windows ici : http://gnuwin32.sourceforge.net/

flex est l'implémentation libre de lex. bison est l'implémentation libre de yacc.

8voto

Lexxmark Points 61

Vous pouvez trouver la dernière version Windows de flex & bison ici : http://sourceforge.net/projects/winflexbison/

7voto

Skurmedel Points 9227

Il y a toujours Cygwin .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X