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

时间:2011-03-28 07:47:33

标签: windows bison yacc lex flex-lexer

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

如何编译这些文件以及如何在Windows平台上为它们创建等效的.c文件?

9 个答案:

答案 0 :(得分:93)

至于今天(2011-04-05,更新时间为2017-11-29),您将需要最新版本:

  1. flex-2.5.4a-1.exe

  2. bison-2.4.1-setup.exe

  3. 之后,请在首选项的目录中进行完整安装,但名称中不能包含空格。我建议C:\GnuWin32将其安装在默认(C:\ Program Files(x86)\ GnuWin32)中,因为bison在目录名称中存在空格问题,而不是括号。

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

  5. 之后,设置PATH变量以包含gccC:\Dev-Cpp\bin)和flex\bisonC:\GnuWin32\bin)中的bin目录。为此,请复制以下内容:;C:\Dev-Cpp\bin;C:\GnuWin32\bin并将其附加到PATH变量的末尾,该变量在此图所示的地点中定义:
    step-by-step to set PATH variable under Win-7.
    如果数字分辨率不高,您可以看到step-by-step here

  6. 打开提示,cd到你的“.l”和“.y”所在的目录,并用以下代码编译:

    1. flex hello.l
    2. bison -dy hello.y
    3. gcc lex.yy.c y.tab.c -o hello.exe
  7. Commands to create lexical analyzer, parser and executable.

    您将能够运行该程序。我做了一个简单测试的来源(臭名昭着的Hello World):

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

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

    编辑:避免“警告:yyerror和yylex的隐式定义”。

    免责声明:请记住,这个答案非常陈旧(自2011年起!)如果由于版本和功能的变化而遇到问题,您可能需要更多的研究,因为我无法更新此答案以反映新的itens。谢谢,我希望这对许多人来说都是一个很好的切入点。

    更新:如果需要完成某些事情(确实很小的更改),请查看github上的官方存储库:https://github.com/drbeco/hellex

    快乐的黑客攻击。

答案 1 :(得分:11)

你(可能想要的)是Flex 2.5.4(有些人现在“维护”它并生成newer versions,但是IMO他们做了更多的事情来解决它而不是解决任何真正的缺点)和{ {3}}(同样)。 (编辑2017-11-17:Flex 2.5.4在Sourceforge上不再可用,Flex github存储库只能回到2.5.5。但你显然仍然可以从{Gnu ftp服务器上获取它} {3}}。)

由于不可避免地会被推荐,我会使用Bison警告反对。 Bison最初是由Robert Corbett编写的,他后来写了Byacc的同一个人,他公开表示当时他并不真正了解或理解他在做什么。不幸的是,年轻而愚蠢,他在GPL下发布它,现在GPL粉丝把它作为生活弊病的答案,尽管它自己的作者基本上说它应该被认为是一个基本上是beta测试产品 - 但是由于错综复杂对于GPL粉丝的推理,byacc的许可证没有足够的限制来获得“免费”资格!

答案 2 :(得分:9)

这里有窗口的flex和bison端口:http://gnuwin32.sourceforge.net/

flex是lex的免费实现。 bison是yacc的免费实现。

答案 3 :(得分:8)

你可以找到最新版的flex&amp; amp;野牛在这里:http://sourceforge.net/projects/winflexbison/

答案 4 :(得分:7)

始终有Cygwin

答案 5 :(得分:3)

转到Git for windows (with Unix tool)的完整安装,bisonflex会随附bin文件夹。

答案 6 :(得分:3)

另外值得注意的是,packaged的WinFlexBison已Chocolatey package manager。安装然后去:

choco install winflexbison

......在撰写本文时,包含Bison 2.7&amp; Flex 2.6.3。

还有winflexbison3(在撰写本文时)有Bison 3.0.4&amp; Flex 2.6.3。

答案 7 :(得分:0)

最简单的方法是下载并安装 cygwin ,并在安装过程中下载gcc和flex软件包。 然后运行lex文件,例如。 abc.l

我们写

flex abc.l

gcc lex.yy.c -o abc.exe

./ abc.exe

答案 8 :(得分:0)

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

  1. 工具->“ Lex文件编译器”
  2. 工具->“ Lex构建”
  3. 工具->“打开CMD”
  4. 然后在命令提示符下键入'name_of_file.exe'example->'1.exe'
  5. 然后输入整个输入,请按Ctrl + Z,然后按Enter。

Example