web-dev-qa-db-fra.com

Comment compiler des fichiers Lex/YACC sous Windows?

J'ai des fichiers Lex et YACC pour analyser mes fichiers (fichier .l et fichier .y).

Comment compiler ces fichiers et comment créer un fichier .c équivalent dans la plate-forme Windows?

49
Thorin Oakenshield

Quant à aujourd'hui (2011-04-05, mis à jour le 29/11/2017), 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, effectuez une installation complète dans un répertoire de votre préférence sans espaces sous le nom. Je suggère C:\GnuWin32. Ne pas installez-le dans par défaut (C:\Program Files (x86)\GnuWin32) car bison a des problèmes d’espace dans les noms de répertoire, pour ne pas dire de parenthèse.

  4. Pensez également à 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 (dans C:\Dev-Cpp\bin) et flex\bison (dans C:\GnuWin32\bin). Pour ce faire, copiez ceci: ;C:\Dev-Cpp\bin;C:\GnuWin32\bin et ajoutez-le à la fin de la variable PATH, définie à l'emplacement indiqué par cette figure:
    step-by-step to set PATH variable under Win-7.
    Si la résolution n’est pas bonne, vous pouvez voir un pas à pas ici .

  6. Ouvrez une invite, accédez au 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 pourrez exécuter le programme. J'ai créé les sources pour un test simple (le fameux 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

%{

#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); }
         ;

Édité: en évitant "attention: définition implicite de yyerror et yylex". 

Avertissement: rappelez-vous, cette réponse est très ancienne (depuis 2011!) Et si vous rencontrez des problèmes en raison de modifications des versions et des fonctionnalités, vous devrez peut-être effectuer davantage de recherches, car je ne peux pas mettre à jour cette réponse pour en refléter les nouveaux éléments. Merci et j'espère que ce sera un bon point d'entrée pour vous comme pour beaucoup d'autres.

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

Heureux piratage.

91
Dr Beco

Ce que vous voulez (probablement) est Flex 2.5.4 (certaines personnes le "maintiennent" maintenant et produisent de nouvelles versions , mais l’OMI a fait plus pour le foutre que pour réparer les défauts réels) et byacc 1.9 (de même). (Edit 2017-11-17: Flex 2.5.4 n'est plus disponible sur Sourceforge, et le référentiel Flex github ne retourne qu'à la version 2.5.5. Mais vous pouvez apparemment toujours l'obtenir d'un serveur ftp Gnu à ftp://ftp.gnu.org/old-gnu/gnu-0.2/src/flex-2.5.4.tar.gz .)

Comme cela sera inévitablement recommandé, je préviendrai contre avec Bison. Bison a été écrit à l'origine par Robert Corbett, le même gars qui a écrit plus tard Byacc, et il déclare ouvertement qu'à l'époque, il ne savait pas ou ne comprenait pas vraiment ce qu'il faisait. Malheureusement, étant jeune et stupide, il l'a publié sous la licence GPL et maintenant, les fans de la GPL le considèrent comme la solution aux maux de la vie, même si son propre auteur dit qu'il devrait être considéré comme un produit essentiellement bêta, raisonnement des fans de GPL, la licence de byacc n’a pas assez de restrictions pour être qualifiée de "gratuite"!

11
Jerry Coffin

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

flex est l'implémentation libre de Lex. bison est la mise en œuvre gratuite de yacc.

9
lesmana

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

8
Lexxmark

Il y a toujours Cygwin .

7
Skurmedel

Il convient également de noter que WinFlexBison a été packagé pour le Gestionnaire de paquets Chocolatey . Installez ça et ensuite:

choco install winflexbison

... qui contient au moment de la rédaction Bison 2.7 & Flex 2.6.3.

Il existe également winflexbison3 qui (au moment de la rédaction de cet article) utilise Bison 3.0.4 & Flex 2.6.3.

3
Alastair Maw

Choisissez l’installation complète de Git pour Windows (avec l’outil Unix) , et bison et flex viendraient avec cela dans le dossier bin.

3
Archy Wilhes

J'avais le même problème, il a une solution très simple.
Étapes à suivre pour exécuter le programme 'Lex':

  1. Outils -> 'Compilateur de fichiers Lex'
  2. Outils -> 'Lex Build'
  3. Outils -> 'Ouvrir CMD'
  4. Puis dans la commande, tapez le type 'name_of_file.exe' -> '1.exe'
  5. Puis saisissez l’entrée complète, appuyez sur Ctrl + Z et appuyez sur Entrée.

Exemple

0
Amit

la méthode la plus simple consiste à télécharger et installer cygwin et à télécharger les packages gcc et flex lors de l'installation . abc.l

nous écrivons 

flex abc.l

gcc Lex.yy.c -o abc.exe

./abc.exe

0
aayush shah