无法编译 flex & bison(未找到符号 x86_64)

Can't compile flex & bison (Symbols not found x86_64)

我试图在我的 Mac 运行 Yosemite 上用 Flex & Bison 编译一个简单的程序,但出现以下错误:

未定义的体系结构符号x86_64: “_yyerror”,引用自: _yyparse 在 pr1-19c182.o ld:未找到体系结构符号 x86_64 clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)

我的两个文件看起来像这样,它们可以在我老师的 Ubuntu 安装上编译,但我无法让它们在我的 Mac:

上运行

pr1.y

%{
    #include <stdio.h>
%}

%%

expr : expr '+' term {printf(" + ");}
    | term 
    ;

term : term '*' fact {printf(" * ");}
    | fact 
    ;

fact : "(" expr ")"
    | '0' {printf("0");}
    | '1' {printf("1");}
    | '2' {printf("2");}
    | '3' {printf("3");}
    | '4' {printf("4");}
    | '5' {printf("5");}
    | '6' {printf("6");}
    | '7' {printf("7");}
    | '8' {printf("8");}
    | '9' {printf("9");}

%%

pr1.l

%{
    #include "pr1.tab.h"
%}

%%

[0-9]   {return (yytext[0]);}
[+*()]  {return (yytext[0]);}
\n      {return (0);}
.       {}

%%

我使用以下命令编译所有内容:

bison -d pr1.y
flex pr1.l
gcc -o result lex.yy.c pr1.tab.c -lfl -std=gnu89

我使用 -std 标志的原因是因为默认是 c99 并且 flex 和 bison 生成的代码会收到警告和错误。有什么想法吗???

您需要在 bison 输入文件 (pr1.y) 中定义 yyerror。并且你需要声明 yylex 否则你会得到另一个警告。

以下可以:

%{
   #include <stdio.h>
   void yyerror(const char* msg) {
      fprintf(stderr, "%s\n", msg);
   }
   int yylex();
%}

如果没有你老师的机器,我不知道它是如何工作的。

此外,Mac OS X 有很旧的 bison 和 flex 版本。您可能想要升级。

查看此答案的第二条评论 post Unable to compile output of lex

在 Mac OS X 上,如果您尝试从命令行编译,则需要 link 针对 libl.a 库,使用 - ll 而不是 -lfl。显然 OS X 没有 libfl.a 库。所以试试这个...

gcc -o result lex.yy.c pr1.tab.c -ll

不知道您是否需要 -std=gnu89 选项。