Подтвердить что ты не робот

Как скомпилировать файлы LEX/YACC в Windows?

У меня есть файлы Lex и YACC для анализа моих файлов (.l file и .y file).

Как скомпилировать эти файлы и как сделать эквивалентный файл .c для них на платформе Windows?

4b9b3361

Ответ 1

На сегодняшний день (2011-04-05, обновлено 2017-11-29) вам понадобятся последние версии:

  • flex-2.5.4a-1.exe

  • bison-2.4.1-setup.exe

  • После этого сделайте полную установку в каталоге вашего предпочтения без пробелов в названии. Я предлагаю C:\GnuWin32. Do не установить его по умолчанию (C:\Program Files (x86)\GnuWin32), потому что bison имеет проблемы с пробелами в именах каталогов, а не в скобках.

  • Также рассмотрите возможность установки Dev-CPP в каталог по умолчанию (C:\Dev-Cpp)

  • После этого установите переменную PATH для включения каталогов bin gccC:\Dev-Cpp\bin) и flex\bisonC:\GnuWin32\bin). Для этого скопируйте это: ;C:\Dev-Cpp\bin;C:\GnuWin32\bin и добавьте его в конец переменной PATH, определенную в месте, показанном на этом рисунке:
    step-by-step to set PATH variable under Win-7.
    Если фигура не в хорошем разрешении, вы можете увидеть шаг за шагом здесь.

  • Откройте приглашение cd в каталог, где ваши ".l" и ".y" есть, и скомпилируйте их с помощью:

    • flex hello.l
    • bison -dy hello.y
    • gcc lex.yy.c y.tab.c -o hello.exe

Commands to create lexical analyzer, parser and executable.

Вы сможете запустить программу. Я сделал источники для простого теста (печально известный Hello World):

Hello.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);
}

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

Отредактировано: избегать "предупреждения: неявное определение yyerror и yylex".

Отказ от ответственности: помните, этот ответ очень старый (с 2011 года!), и если у вас возникают проблемы из-за изменения версий и функций, вам может потребоваться больше исследований, потому что я не могу обновить этот ответ, чтобы отразить новые itens. Спасибо, и я надеюсь, что это будет хорошей отправной точкой для вас, как это было для многих.

Обновления: если что-то (действительно небольшие изменения) необходимо выполнить, обратитесь в официальный репозиторий в github: https://github.com/drbeco/hellex

Счастливый взлом.

Ответ 2

То, что вы (возможно, хотите), это Flex 2.5.4 (некоторые люди сейчас "поддерживают" его и производят более новые версии, но IMO они сделали больше, чтобы исправить это, чем исправить любые реальные недостатки) и byacc 1.9 (аналогично). (Edit 2017-11-17: Flex 2.5.4 больше не доступен для Sourceforge, а репозиторий Flex github возвращается только к 2.5.5. Но вы, видимо, все равно можете получить его с сервера FTP Gnu в ftp://ftp.gnu.org/old-gnu/gnu-0.2/src/flex-2.5.4.tar.gz.)

Поскольку это неизбежно будет рекомендовано, я предостерег от использования Bison. Bison был первоначально написан Робертом Корбеттом, тем же парнем, который позже написал Byacc, и он открыто заявляет, что в то время он не знал и не понимал, что он делает. К сожалению, будучи молодым и глупым, он выпустил его под GPL, и теперь поклонники GPL подталкивают его как ответ на жизненные проблемы, хотя его собственный автор в основном говорит, что его следует рассматривать как по существу продукт для бета-тестирования, - но из-за запутанных аргументация поклонников GPL, лицензия byacc не имеет достаточных ограничений, чтобы квалифицироваться как "свободные"!

Ответ 3

Здесь есть порты flex и bison для окон: http://gnuwin32.sourceforge.net/

flex - это бесплатная реализация lex. bison - это бесплатная реализация yacc.

Ответ 4

Всегда Cygwin.

Ответ 7

Также стоит отметить, что WinFlexBison был упакован для Chocolatey менеджер пакетов. Установите это, а затем перейдите:

choco install winflexbison

... который на момент написания содержит Bison 2.7 и Flex 2.6.3.

Существует также winflexbison3, который (на момент написания) имеет Bison 3.0.4 и Flex 2.6.3.

Ответ 8

Самый простой способ - загрузить и установить cygwin и загрузить gcc и flex пакеты во время установки. Затем для запуска lex файла, например. abc.l

пишем

flex abc.l

gcc lex.yy.c -o abc.exe

./abc.exe