代码之家  ›  专栏  ›  技术社区  ›  Luis Eduardo Garay

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

  •  3
  • Luis Eduardo Garay  · 技术社区  · 10 年前

    我正在尝试在Flex&Bison在我的Mac上运行Yosemite,但出现以下错误:

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

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

    第1年

    %{
        #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");}
    
    %%
    

    第1页

    %{
        #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生成的代码会收到警告和错误。有什么想法吗???

    2 回复  |  直到 10 年前
        1
  •  6
  •   Matteo Piombo    8 年前

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

    以下内容可以:

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

    我不知道在你老师的机器上没有它是怎么工作的。

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

        2
  •  4
  •   Community datashaman    7 年前

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

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

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

    不知道您对 -std=gnu89 选项