我正在使用Lex
和YACC
文件来解析我的文件(.l
文件和.y
文件)。
如何在Windows平台上编译这些文件,并生成相应的.c
文件?
我正在使用Lex
和YACC
文件来解析我的文件(.l
文件和.y
文件)。
如何在Windows平台上编译这些文件,并生成相应的.c
文件?
截止到今天(2011-04-05,更新于2017-11-29),你需要安装以下最新版本:
之后,在你喜欢的目录没有空格的情况下进行完整安装。我建议使用 C:\GnuWin32
。不要在默认目录(C:\ProgramFiles(x86)\GnuWin32)中安装,因为bison和目录名中的空格,更不用说括号了。
此外,考虑将Dev-CPP安装在默认目录(C:\Dev-Cpp
)中
之后,将PATH变量设置为包括gcc
的bin目录(在C:\Dev-Cpp\bin
中)和flex \ bison
的bin目录(在C:\GnuWin32\bin
中)。要实现这一点,请复制:; C:\Dev-Cpp\bin; C:\GnuWin32\bin
,并将其附加到PATH
变量的末尾,在此图所示的地方定义:
如果图像不清晰,您可以在此处查看详细步骤。
打开命令提示符,转到“.l”和“.y”文件所在的目录,并使用以下命令编译它们:
flex hello.l
bison -dy hello.y
gcc lex.yy.c y.tab.c -o hello.exe
然后,您就可以运行程序了。我为一个简单的测试(臭名昭著的HelloWorld
)制作了源代码:
%{
#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); }
;
编辑:避免“warning: implicit definition of yyerror and yylex”警告。
免责声明:请记住,这个答案非常老(自2011年以来!),如果由于版本和功能的更改而遇到问题,您可能需要进行更多的研究,因为我无法更新此答案以反映新项目。谢谢,希望这将成为您的好入门点,就像它对许多人一样。
更新:如果需要进行一些微小的更改,请查看官方存储库:https://github.com/drbeco/hellex
愉快的编程。
由于它将不可避免地被推荐,我会警告不要使用 Bison。Bison最初是由Robert Corbett编写的,后来他又写了Byacc,并公开表示当时他并不真正知道或理解自己在做什么。不幸的是,年轻而愚蠢的他将其发布为GPL,现在GPL粉丝将其推为解决生活问题的答案,尽管其作者基本上说它应该被视为基本上是一个beta测试产品 - 但通过GPL粉丝的曲折推理,byacc的许可证没有足够的限制来符合“自由”的资格!
choco install winflexbison
...目前版本包含Bison 2.7和Flex 2.6.3。
此外,还有winflexbison3
,它(目前)包含Bison 3.0.4和Flex 2.6.3。
flex abc.l
gcc lex.yy.c -o abc.exe
./abc.exe
我曾经遇到过同样的问题,它有一个非常简单的解决方案。
执行“Lex”程序的步骤:
bison -dy hello.y
不会生成任何文件,它只是在提示符中显示一些代码。我该如何创建y.tab.c
文件? - Thorin Oakenshieldbison -dy hello.y
命令后按下<enter>
键时,你得到了什么?如果你提供确切的细节,也许我们可以找出问题所在。如果你认为这对于一个“评论”来说太多了,也许你可以用错误来提问。 - DrBeco