如何在Windows上编译LEX / YACC文件?
我有Lex
和YACC
文件来parsing我的文件( .l
文件和.y
文件)。
如何编译这些文件,以及如何在Windows平台上为他们制作等效的.c
文件?
至于今天(2011-04-05)你将需要最新版本的:
-
柔性2.5.4a-的1.exe
-
野牛-2.4.1-SETUP.EXE
-
之后,请在您的首选项的目录中进行完整安装, 而名称中没有空格 。 我build议
C:\GnuWin32
。 不要将它安装在默认的 (C:\ Program Files(x86)\ GnuWin32)中,因为bison在目录名称中有空格问题,而不是括号。 -
另外,请考虑将Dev-CPP安装在默认目录(
C:\Dev-Cpp
) -
之后,将PATHvariables设置为包含
gcc
(在C:\Dev-Cpp\bin
)和flex\bison
(在C:\GnuWin32\bin
)中的C:\GnuWin32\bin
。 为此,拷贝:;C:\Dev-Cpp\bin;C:\GnuWin32\bin
,并将其追加到PATH
variables的末尾,在此图所示的地方定义:
如果这个数字不是很好的解决scheme,你可以在这里看到一步一步的 。 -
打开一个提示符,cd到你的“.l”和“.y”所在的目录,然后编译它们:
-
flex hello.l
-
bison -dy hello.y
-
gcc lex.yy.c y.tab.c -o hello.exe
-
你将能够运行该程序。 我做了一个简单的testing(臭名昭着的Hello World
)的来源:
Hello.l
%{ #include <stdlib.h> #include "y.tab.h" %} %% ("hi"|"oi")"\n" { return HI; } ("tchau"|"bye")"\n" { return BYE; } . { yyerror(); } %% int main(void) { yyparse(); return 0; } int yywrap(void) { return 0; } int yyerror(void) { printf("Error\n"); exit(1); }
Hello.y
%{ #include <stdio.h> %} %token HI BYE %% program: hi bye ; hi: HI { printf("Hello World\n"); } ; bye: BYE { printf("Bye World\n"); exit(0); } ;
Flex 2.5.4(有些人现在“维护”它,生成更新的版本 ,但是IMO已经做了更多的工作来弥补任何真正的缺陷),并且1.9 (同样)。 (编辑2017年11月17日:Flex 2.5.4不再在Sourceforge上可用,Flex的github仓库只能回到2.5.5。但是,你仍然可以从一个Gnu ftp服务器获取它在ftp:// http://ftp.gnu.org/old-gnu/gnu-0.2/src/flex-2.5.4.tar.gz 。)
由于它将不可避免地被推荐,我会警告不要使用野牛。 野牛最初是由罗伯特·科贝特(Robert Corbett)写的,后者是后来写过比亚克(Byacc)的同一个人,他公开声明当时他并不真正了解或理解他在做什么。 不幸的是,他年轻而愚蠢,他在GPL下发布了它,现在GPL粉丝推动它作为生活中的弊病的答案,尽pipe它自己的作者基本上认为它应该被认为基本上是一个betatesting产品 – 但是由于错综复杂GPL粉丝的推理,byacc的执照没有足够的限制,以“免费”的资格!
这里有windows的flex和bison的端口: http : //gnuwin32.sourceforge.net/
flex是lex的免费实现。 野牛是yacc的免费执行。
Cygwin总是有的
你可以在这里find最新的flex和bison的windows版本: http : //sourceforge.net/projects/winflexbison/
去完整的安装Git的窗口(与Unix工具) ,和bison
和flex
会出现在bin
文件夹中。
另外值得注意的是,WinFlexBison已经被包装在了Chocolatey包pipe理器中 。 安装,然后去:
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