bison - Sådan kompileres LEX/YACC filer på Windows?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har Lex og YACC filer til at analysere mine filer (.l fil og .y fil).


Hvordan compileres disse filer og hvordan man laver tilsvarende .c -fil til dem i Windows-platformen?

Bedste reference


Med hensyn til i dag (2011-04-05, opdateret 2017-11-29) skal du have de nyeste versioner af:



  1. flex-2.5.4a-1.exe [25]

  2. bison-2.4.1-setup.exe [26]

  3. Udfør derefter en fuld installation i en mappe med din præference uden mellemrum i navnet . Jeg foreslår C:GnuWin32. Du skal ikke installere det i standard (C: \ Program Files (x86) \ GnuWin32), fordi bison har problemer med mellemrum i mappenavne, ikke for at sige parentes.

  4. Overvej også at installere Dev-CPP i standardmappen (C:Dev-Cpp) [27]

  5. Indstil derefter PATH-variablen til at omfatte bin-katalogerne til gcc (i C:Dev-Cppin) og flexison (i C:GnuWin32in). For at gøre det skal du kopiere dette: ;C:Dev-Cppin;C:GnuWin32in og tilføje det til slutningen af ​​variablen PATH, der er defineret i stedet viser ved denne figur:

    trin for trin for at indstille PATH-variabel under Win-7.

    Hvis figuren ikke er i god opløsning, kan du se et trin for trin her. [28]

  6. Åbn en hurtig cd til den mappe, hvor din '.l' og '.y' er, og kompilere dem med:



    1. flex hello.l

    2. bison -dy hello.y

    3. gcc lex.yy.c y.tab.c -o hello.exe




Kommandoer til at skabe leksikalanalysator, parser og eksekverbar.


Du vil kunne køre programmet. Jeg lavede kilderne til en simpel test (den berygtede Hello World):


Hello.l



\%{

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

\%}

\%\%

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

\%\%

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

int yywrap(void)
{
   return 0;
}

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


Hello.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
");   }
        ;
bye:    
        BYE    { printf("Bye World
"); exit(0); }
         ;





Redigeret: undgå 'advarsel: implicit definition af yyerror og yylex'.


Ansvarsfraskrivelse: Husk, dette svar er meget gammelt (siden 2011!), Og hvis du løber ind i problemer på grund af versioner og funktioner, der ændres, kan du have brug for mere forskning, fordi jeg ikke kan opdatere dette svar for at afspejle nye itens. Tak og jeg håber Dette vil være et godt indgangspunkt for dig som det var for mange.


Opdateringer: Hvis noget (rigtig små ændringer) skal gøres, bedes du tjekke det officielle depot på github: https://github.com/drbeco/hellex[29]


Glad hacking.

Andre referencer 1


Hvad du sandsynligvis vil) er Flex 2.5.4. Nogle mennesker er nu ved at 'vedligeholde' det og producere nyere versioner, men IMO har de gjort mere for at skrue det op end rette eventuelle ulemper) og byacc 1.9 (ligeledes). < em> (Rediger 2017-11-17: Flex 2.5.4 er ikke længere tilgængelig på Sourceforge, og Flex Github-arkivet går kun tilbage til 2.5.5. Men du kan tilsyneladende stadig få det fra en Gnu ftp-server på ftp://ftp.gnu.org/old-gnu/gnu-0.2/src/flex-2.5.4.tar.gz.)[30]ftp://ftp.cs.berkeley.edu/pub/4bsd/byacc.1.9.tar.Zftp://ftp.gnu.org/old-gnu/gnu-0.2/src/flex-2.5.4.tar.gz


Da det uundgåeligt anbefales, advarer jeg imod ved hjælp af Bison. Bison blev oprindeligt skrevet af Robert Corbett, den samme fyr, der senere skrev Byacc, og han oplyser åbenlyst, at han på det tidspunkt ikke rigtigt vidste eller forstod hvad han gjorde. Desværre var han ung og dum, frigjort han under GPL og nu skubber GPL-fansen det som svaret på livets ondskab, selvom dens egen forfatter i bund og grund siger, at det burde betragtes som i det væsentlige et beta-testprodukt - men ved GPL-fansens overvældede begrundelse gør byacc's licens ikke ' Har ikke nok begrænsninger til at kvalificere sig som 'gratis'!

Andre referencer 2


Der er porte af flex og bison til Windows her: http://gnuwin32.sourceforge.net/[33]


flex er den frie implementering af lex. bison er den gratis implementering af yacc. [34] [35]

Andre referencer 3


Der er altid Cygwin. [36]

Andre referencer 4


Du kan finde den nyeste Windows-version af Flex & bison her: http://sourceforge.net/projects/winflexbison/[37]

Andre referencer 5


Gå til den fulde installation af Git for Windows (med Unix-værktøj), og bison og flex vil medtages i mappen bin. [38]

Andre referencer 6


Det er også værd at bemærke, at WinFlexBison er pakket til Chocolatey pakkechef. Installer det og gå derefter: [39] [40]


choco install winflexbison


... som på tidspunktet for skrivningen indeholder Bison 2.7 & Flex 2.6.3.


Der er også winflexbison3 som (på tidspunktet for skrivning) har Bison 3.0.4 & Flex 2.6.3.

Andre referencer 7


Den nemmeste metode er at downloade og installere cygwin og downloade gcc og flex-pakker under installationen.
Dernæst at køre en lex fil til f.eks. abc.l


vi skriver


flex abc.l


gcc lex.yy.c -o abc.exe


./abc.exe