我正在尝试在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生成的代码会收到警告和错误。任何想法???
答案 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
选项的需求。