【问题标题】:How to compile LEX/YACC files on Windows?如何在 Windows 上编译 LEX/YACC 文件?
【发布时间】:2011-07-24 06:47:44
【问题描述】:

我有LexYACC 文件来解析我的文件(.l 文件和.y 文件)。

如何编译这些文件以及如何在windows平台上为它们制作等效的.c文件?

【问题讨论】:

    标签: windows bison yacc lex flex-lexer


    【解决方案1】:

    至于今天(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. 另外,考虑在默认目录中安装Dev-CPP (C:\Dev-Cpp)

    5. 之后,设置 PATH 变量以包含gcc(在C:\Dev-Cpp\bin)和flex\bison(在C:\GnuWin32\bin)的bin 目录。为此,请复制以下内容:;C:\Dev-Cpp\bin;C:\GnuWin32\bin 并将其附加到 PATH 变量的末尾,该变量定义在下图所示的位置:

      如果图分辨率不好,可以看到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

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

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

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

    免责声明:请记住,这个答案已经很老了(自 2011 年以来!),如果您因版本和功能更改而遇到问题,您可能需要进行更多研究,因为我无法更新此答案以反映新的问题。谢谢,我希望这对你来说是一个很好的切入点,就像对许多人一样。

    更新:如果需要做一些事情(非常小的更改),请查看 github 上的官方存储库:https://github.com/drbeco/hellex

    黑客愉快。

    【讨论】:

    • bison -dy hello.y 不生成任何文件。它只是在提示中显示一些代码。我如何创建y.tab.c
    • @Pramodh 这很奇怪......它显示了什么代码?错误代码?还是一些源代码?
    • 我现在在两台不同的机器上完成了这个过程,并且都可以工作。您确定您正在一步一步地遵循所有这些吗?在上面的命令提示屏幕截图中,您是否有相同的 flex 屏幕(没有错误)?当你在输入bison -dy hello.y 命令后按下&lt;enter&gt; 键时,你得到了什么exactly?如果您提供确切的详细信息,也许我们可以找出问题所在。如果您认为 comment 太过分了,也许您可​​以提出一个错误的问题。
    • 请注意,这个源代码也适用于 Linux,它是一个非常简短且有用的示例程序。
    • 谢谢jrh。你发现了我的秘密! :) 它最初是为 linux 编写的,然后在 windows 和 linux 上进行了测试和调试。
    【解决方案2】:

    您(可能想要)是 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 的许可证没有足够的限制来获得“免费”的资格!

    【讨论】:

    • 嘿 Jerry,你有指向 Corbett 的链接,说明当时他并不真正知道或不了解自己在做什么吗?谢谢。
    • @RayHulha:抱歉,我手头没有链接。
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      你可以在这里找到最新的 windows 版本的 flex & bison:http://sourceforge.net/projects/winflexbison/

      【讨论】:

        【解决方案5】:

        总是有Cygwin

        【讨论】:

          【解决方案6】:

          去完整安装Git for windows (with Unix tool)bisonflex 将在bin 文件夹中随附。

          【讨论】:

            【解决方案7】:

            另外值得注意的是,WinFlexBison 已经将packaged 换成了Chocolatey package manager。安装它然后去:

            choco install winflexbison
            

            ...在撰写本文时包含 Bison 2.7 和 Flex 2.6.3。

            还有winflexbison3(在撰写本文时)具有 Bison 3.0.4 和 Flex 2.6.3。

            【讨论】:

              【解决方案8】:

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

              我们写

              flex abc.l
              gcc lex.yy.c -o abc.exe
              ./abc.exe
              

              【讨论】:

              • 如果您希望消耗数百兆的磁盘空间,这是最简单的。不然。
              • 这实际上是我在博士课程中被建议这样做的方式
              【解决方案9】:

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

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

              Example

              【讨论】:

                猜你喜欢
                • 2017-04-14
                • 2016-10-20
                • 2020-04-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2017-03-18
                • 2021-02-25
                • 1970-01-01
                相关资源
                最近更新 更多