У меня есть файлы Lex
и YACC
для анализа моих файлов (.l
file и .y
file).
Как скомпилировать эти файлы и как сделать эквивалентный файл .c
для них на платформе Windows?
У меня есть файлы Lex
и YACC
для анализа моих файлов (.l
file и .y
file).
Как скомпилировать эти файлы и как сделать эквивалентный файл .c
для них на платформе Windows?
На сегодняшний день (2011-04-05, обновлено 2017-11-29) вам понадобятся последние версии:
После этого сделайте полную установку в каталоге вашего предпочтения без пробелов в названии. Я предлагаю C:\GnuWin32
. Do не установить его по умолчанию (C:\Program Files (x86)\GnuWin32), потому что bison имеет проблемы с пробелами в именах каталогов, а не в скобках.
Также рассмотрите возможность установки Dev-CPP в каталог по умолчанию (C:\Dev-Cpp
)
После этого установите переменную PATH для включения каталогов bin gcc
(в C:\Dev-Cpp\bin
) и flex\bison
(в C:\GnuWin32\bin
). Для этого скопируйте это: ;C:\Dev-Cpp\bin;C:\GnuWin32\bin
и добавьте его в конец переменной PATH
, определенную в месте, показанном на этом рисунке:
Если фигура не в хорошем разрешении, вы можете увидеть шаг за шагом здесь.
Откройте приглашение cd в каталог, где ваши ".l" и ".y" есть, и скомпилируйте их с помощью:
flex hello.l
bison -dy hello.y
gcc lex.yy.c y.tab.c -o hello.exe
Вы сможете запустить программу. Я сделал источники для простого теста (печально известный Hello World
):
%{
#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);
}
%{
#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
Счастливый взлом.
То, что вы (возможно, хотите), это 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 не имеет достаточных ограничений, чтобы квалифицироваться как "свободные"!
Здесь есть порты flex и bison для окон: http://gnuwin32.sourceforge.net/
flex - это бесплатная реализация lex. bison - это бесплатная реализация yacc.
Всегда Cygwin.
Вы можете найти последнюю версию flex flex и bison здесь: http://sourceforge.net/projects/winflexbison/
Пойдите для полной установки Git для окон (с помощью инструмента Unix), а bison
и flex
будут поставляться с он находится в папке bin
.
Также стоит отметить, что WinFlexBison был упакован для Chocolatey менеджер пакетов. Установите это, а затем перейдите:
choco install winflexbison
... который на момент написания содержит Bison 2.7 и Flex 2.6.3.
Существует также winflexbison3
, который (на момент написания) имеет Bison 3.0.4 и Flex 2.6.3.
Самый простой способ - загрузить и установить cygwin и загрузить gcc и flex пакеты во время установки. Затем для запуска lex файла, например. abc.l
пишем
flex abc.l
gcc lex.yy.c -o abc.exe
./abc.exe