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

时间:2015-01-29 05:01:06

标签: macos bison osx-yosemite flex-lexer

我正在尝试在Flex&上编译一个简单的程序。在我的Mac上运行优胜美地的Bison但是得到以下错误:

架构x86_64的未定义符号:   “_yyerror”,引自:       pr1-19c182.o中的_yyparse 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生成的代码会收到警告和错误。任何想法???

2 个答案:

答案 0 :(得分:4)

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

以下情况可以接受:

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

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

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

答案 1 :(得分:3)

在此帖Unable to compile output of lex

上查看答案的第2条评论

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

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

不了解您对-std=gnu89选项的需求。