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

Tho*_*eld 51 windows yacc lex bison flex-lexer

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

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

Dr *_*eco 96

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

  1. 柔性2.5.4a-的1.exe

  2. 野牛-2.4.1-SETUP.EXE

  3. 之后,在您的首选项目录中进行完整安装,名称中不能有空格.我建议C:\GnuWin32.难道不是在它安装默认(C:\ Program Files文件(x86)的\的GnuWin32),因为野牛与目录名中的空间问题,而不是说括号.

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

  5. 之后,设置PATH变量以包含gcc(in C:\Dev-Cpp\bin)和flex\bison(in C:\GnuWin32\bin)的bin目录.为此,复制此: ;C:\Dev-Cpp\bin;C:\GnuWin32\bin并将其附加到PATH变量的末尾,该变量在此图所示的地点中定义:
    在Win-7下逐步设置PATH变量.
    如果图形分辨率不高,您可以在此处逐步查看.

  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):

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);
}
Run Code Online (Sandbox Code Playgroud)

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); }
         ;
Run Code Online (Sandbox Code Playgroud)

编辑:避免"警告:yyerror和yylex的隐含定义".

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

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

快乐的黑客.


Jer*_*fin 11

你(可能想要的)是Flex 2.5.4(有些人现在"维护"它并生成更新的版本,但IMO他们做了更多的事情来解决它而不是解决任何真正的缺点)和byacc 1.9(同样).(编辑2017-11-17:Flex 2.5.4在Sourceforge上不再可用,而且Flex github存储库只能回到2.5.5.但你显然仍然可以从ftp://的Gnu 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的许可证没有足够的限制来获得"免费"资格!


les*_*ana 9

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

flex是lex的免费实现.野牛是yacc的免费实施.


小智 8

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


Sku*_*del 7

总是有Cygwin.