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

标签 windows bison yacc lex flex-lexer

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

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

最佳答案

至于今天(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的bin目录\bison(在 C:\GnuWin32\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

Commands to create lexical analyzer, parser and executable.

您将能够运行该程序。我制作了一个简单测试的源代码(臭名昭著的 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 年以来!),如果您因版本和功能更改而遇到问题,您可能需要更多研究,因为我无法更新此答案以反射(reflect)新问题。谢谢,我希望这对您和许多人来说都是一个很好的切入点。

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

祝你黑客愉快。

关于windows - 如何在 Windows 上编译 LEX/YACC 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5456011/

相关文章:

c# - 以编程方式将访问控制列表 (ACL) 权限分配给 'this folder, subfolders and files'

bison - flex/bison 解析器编译时出现段错误

c - GCC 和 Flex/Bison 没有效果警告的声明

Emacs TAGS 表被 lex/yacc 文件中的 #line 指令混淆

syntax-error - 来自lex和yacc的运行时 “syntax error”

windows - vmware:无法使用 NAT IP 地址 ping,但可以 ping 物理 IP

windows - 我可以只在 ebextensions 中包含一个脚本而不必构建一个吗?

windows - 如何为 Windows 编译 liboauth

compiler-construction - 将属性从 flex 返回给 bison

c - 如何解决在 Bison 中使用相同字符的两个不同运算符之间的歧义冲突