我有 Lex
和 YACC
文件来解析我的文件(.l
文件和 .y
文件)。
如何编译这些文件以及如何在windows平台上为它们制作等效的.c
文件?
最佳答案
至于今天(2011-04-05,更新于 2017-11-29),您将需要最新版本的:
之后,在您喜欢的名称中不带空格的目录中进行完整安装。我建议使用
C:\GnuWin32
。 不要将其安装在默认(C:\Program Files (x86)\GnuWin32)中,因为 bison 在目录名称中存在空格问题,更不用说括号了。另外,考虑安装 Dev-CPP在默认目录 (
C:\Dev-Cpp
)之后,设置PATH变量包含
gcc
(在C:\Dev-Cpp\bin
)和flex的bin目录\bison
(在C:\GnuWin32\bin
中)。为此,复制以下内容:;C:\Dev-Cpp\bin;C:\GnuWin32\bin
并将其附加到PATH
变量的末尾,该变量定义于此图所示的地方:
如果图形分辨率不高,您可以看到 step-by-step here .打开一个提示符,cd 到您的“.l”和“.y”所在的目录,然后用以下命令编译它们:
flex hello.l
bison -dy hello.y
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 年以来!),如果您因版本和功能更改而遇到问题,您可能需要更多研究,因为我无法更新此答案以反射(reflect)新问题。谢谢,我希望这对您和许多人来说都是一个很好的切入点。
更新:如果需要做一些事情(非常小的改变),请查看 github 上的官方存储库:https://github.com/drbeco/hellex
祝你黑客愉快。
关于windows - 如何在 Windows 上编译 LEX/YACC 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5456011/