如何在Windows上编译LEX/YACC文件?

66

我正在使用LexYACC文件来解析我的文件(.l文件和.y文件)。

如何在Windows平台上编译这些文件,并生成相应的.c文件?

9个回答

120

截止到今天(2011-04-05,更新于2017-11-29),你需要安装以下最新版本:

  1. flex-2.5.4a-1.exe

  2. bison-2.4.1-setup.exe

  3. 之后,在你喜欢的目录没有空格的情况下进行完整安装。我建议使用 C:\GnuWin32。不要在默认目录(C:\ProgramFiles(x86)\GnuWin32)中安装,因为bison和目录名中的空格,更不用说括号了。

  4. 此外,考虑将Dev-CPP安装在默认目录(C:\Dev-Cpp)中

  5. 之后,将PATH变量设置为包括gcc的bin目录(在C:\Dev-Cpp\bin中)和flex \ bison的bin目录(在C:\GnuWin32\bin中)。要实现这一点,请复制:; C:\Dev-Cpp\bin; C:\GnuWin32\bin,并将其附加到PATH变量的末尾,在此图所示的地方定义:
    step-by-step to set PATH variable under Win-7.
    如果图像不清晰,您可以在此处查看详细步骤。

  6. 打开命令提示符,转到“.l”和“.y”文件所在的目录,并使用以下命令编译它们:

    1. flex hello.l
    2. bison -dy hello.y
    3. gcc lex.yy.c y.tab.c -o hello.exe

Commands to create lexical analyzer, parser and executable.

然后,您就可以运行程序了。我为一个简单的测试(臭名昭著的HelloWorld)制作了源代码:

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

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

编辑:避免“warning: implicit definition of yyerror and yylex”警告。

免责声明:请记住,这个答案非常老(自2011年以来!),如果由于版本和功能的更改而遇到问题,您可能需要进行更多的研究,因为我无法更新此答案以反映新项目。谢谢,希望这将成为您的好入门点,就像它对许多人一样。

更新:如果需要进行一些微小的更改,请查看官方存储库:https://github.com/drbeco/hellex

愉快的编程。


bison -dy hello.y 不会生成任何文件,它只是在提示符中显示一些代码。我该如何创建 y.tab.c 文件? - Thorin Oakenshield
我现在已经在两台不同的机器上执行了这个过程,都可以正常工作。你确定你是按照步骤进行的吗?在上面的命令提示符截图中,你是否得到了与 flex 相同的屏幕(没有错误)?当你在输入 bison -dy hello.y 命令后按下 <enter> 键时,你得到了什么?如果你提供确切的细节,也许我们可以找出问题所在。如果你认为这对于一个“评论”来说太多了,也许你可以用错误来提问。 - DrBeco
感谢EJP的建议和点踩。优秀的批评是这个网站变得伟大的原因。虽然在这种情况下,我可能不同意,因为所提到的图片使整个答案更加美观易懂。祝好。 - DrBeco
1
提醒一下,这个源代码在Linux上也可以运行,并且它是一个非常简短和有用的示例程序。 - jrh
1
谢谢jrh。你发现了我的秘密! :) 它最初是为Linux编写的,然后在Windows和Linux上进行了测试和调试。 - DrBeco
显示剩余5条评论

13
你(可能想要的)是 Flex 2.5.4 (现在有些人正在“维护”它并生成新版本,但在我看来,他们更多地破坏了它而不是修复任何真正的缺陷),以及byacc 1.9(同样如此)。(编辑于2017-11-17:Flex 2.5.4 在Sourceforge上已不可用,Flex github存储库仅返回到2.5.5。但显然您仍然可以从Gnu ftp服务器获取它ftp://ftp.gnu.org/old-gnu/gnu-0.2/src/flex-2.5.4.tar.gz。)

由于它将不可避免地被推荐,我会警告不要使用 Bison。Bison最初是由Robert Corbett编写的,后来他又写了Byacc,并公开表示当时他并不真正知道或理解自己在做什么。不幸的是,年轻而愚蠢的他将其发布为GPL,现在GPL粉丝将其推为解决生活问题的答案,尽管其作者基本上说它应该被视为基本上是一个beta测试产品 - 但通过GPL粉丝的曲折推理,byacc的许可证没有足够的限制来符合“自由”的资格!


嘿,杰瑞,你有 Corbett 的链接吗?他在当时并不真正知道或理解自己在做什么吗?谢谢。 - Ray Hulha
@RayHulha:抱歉,我手头没有链接。 - Jerry Coffin

10

8

7

3

3
值得注意的是,WinFlexBison已经被打包Chocolatey软件包管理器的一部分。安装后,执行以下步骤:
choco install winflexbison

...目前版本包含Bison 2.7和Flex 2.6.3。

此外,还有winflexbison3,它(目前)包含Bison 3.0.4和Flex 2.6.3。


2
最简单的方法是下载并安装 cygwin,在安装过程中下载gcc和flex包。 然后运行一个lex文件,例如abc.l。
我们写:
flex abc.l
gcc lex.yy.c -o abc.exe
./abc.exe

1
只有当你喜欢消耗数百兆磁盘空间时,这才是最简单的选择。否则就不是了。 - user207421
这实际上是我在博士课程中被建议采用的方法。 - Paul

0

我曾经遇到过同样的问题,它有一个非常简单的解决方案。
执行“Lex”程序的步骤:

  1. 工具->“Lex文件编译器”
  2. 工具->“Lex Build”
  3. 工具->“打开CMD”
  4. 然后在命令提示符中键入“name_of_file.exe”,例如->“1.exe”
  5. 然后输入整个输入,按Ctrl + Z并按Enter。

示例


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接