无法编译 flex & bison (Symbols not found x86_64)

Lui*_*ray 3 macos bison flex-lexer osx-yosemite

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

架构 x86_64 的未定义符号:“_yyerror”,引用自:pr1-19c182.old 中的 _yyparse:找不到架构 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");}

%%
Run Code Online (Sandbox Code Playgroud)

pr1.l

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

%%

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

%%
Run Code Online (Sandbox Code Playgroud)

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

bison -d pr1.y
flex pr1.l
gcc -o result lex.yy.c pr1.tab.c -lfl -std=gnu89
Run Code Online (Sandbox Code Playgroud)

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

ric*_*ici 5

您需要yyerror在您的野牛输入文件 ( pr1.y) 中定义。并且您需要声明,yylex否则您将收到另一个警告。

以下会很好:

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

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

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