【发布时间】:2011-07-24 06:47:44
【问题描述】:
我有Lex 和YACC 文件来解析我的文件(.l 文件和.y 文件)。
如何编译这些文件以及如何在windows平台上为它们制作等效的.c文件?
【问题讨论】:
标签: windows bison yacc lex flex-lexer
我有Lex 和YACC 文件来解析我的文件(.l 文件和.y 文件)。
如何编译这些文件以及如何在windows平台上为它们制作等效的.c文件?
【问题讨论】:
标签: windows bison yacc lex flex-lexer
至于今天(2011-04-05,2017-11-29 更新),您将需要以下最新版本:
之后,在您喜欢的目录中进行完整安装名称中不要包含空格。我建议C:\GnuWin32。不要不要将其安装在默认 (C:\Program Files (x86)\GnuWin32) 中,因为bison 存在目录名称中的空格问题,更不用说括号了。
另外,考虑在默认目录中安装Dev-CPP (C:\Dev-Cpp)
之后,设置 PATH 变量以包含gcc(在C:\Dev-Cpp\bin)和flex\bison(在C:\GnuWin32\bin)的bin 目录。为此,请复制以下内容:;C:\Dev-Cpp\bin;C:\GnuWin32\bin 并将其附加到 PATH 变量的末尾,该变量定义在下图所示的位置:
如果图分辨率不好,可以看到step-by-step here。
打开提示符,cd 到“.l”和“.y”所在的目录,然后编译它们:
flex hello.lbison -dy hello.ygcc 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 年以来!),如果您因版本和功能更改而遇到问题,您可能需要进行更多研究,因为我无法更新此答案以反映新的问题。谢谢,我希望这对你来说是一个很好的切入点,就像对许多人一样。
更新:如果需要做一些事情(非常小的更改),请查看 github 上的官方存储库:https://github.com/drbeco/hellex
黑客愉快。
【讨论】:
bison -dy hello.y 不生成任何文件。它只是在提示中显示一些代码。我如何创建y.tab.c?
bison -dy hello.y 命令后按下<enter> 键时,你得到了什么exactly?如果您提供确切的详细信息,也许我们可以找出问题所在。如果您认为 comment 太过分了,也许您可以提出一个错误的问题。
您(可能想要)是 Flex 2.5.4(有些人现在正在“维护”它并生产 newer versions,但 IMO 他们做的更多是搞砸它而不是修复任何真正的缺点)和 byacc 1.9 (同样地)。 (编辑 2017-11-17:Flex 2.5.4 在 Sourceforge 上不再可用,Flex github 存储库只能回到 2.5.5。但您显然仍然可以从位于 @ 的 Gnu ftp 服务器获取它987654323@.)
由于不可避免地会被推荐,我会警告反对使用 Bison。 Bison 最初是由后来编写 Byacc 的同一个人 Robert Corbett 编写的,他公开表示当时他并不真正知道或不了解自己在做什么。不幸的是,由于年轻而愚蠢,他在 GPL 下发布了它,现在 GPL 粉丝将其作为生活弊病的答案,尽管它自己的作者基本上说它应该被认为本质上是一个 beta 测试产品——但是由令人费解的GPL 粉丝的推理,byacc 的许可证没有足够的限制来获得“免费”的资格!
【讨论】:
这里有 flex 和 bison 的 windows 端口:http://gnuwin32.sourceforge.net/
【讨论】:
你可以在这里找到最新的 windows 版本的 flex & bison:http://sourceforge.net/projects/winflexbison/
【讨论】:
总是有Cygwin。
【讨论】:
去完整安装Git for windows (with Unix tool),bison 和flex 将在bin 文件夹中随附。
【讨论】:
另外值得注意的是,WinFlexBison 已经将packaged 换成了Chocolatey package manager。安装它然后去:
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
【讨论】:
我遇到了同样的问题,它有一个非常简单的解决方案。
执行“Lex”程序的步骤:
【讨论】: