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 生成的代码会收到警告和错误。有任何想法吗???
您需要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。您可能想要升级。
| 归档时间: |
|
| 查看次数: |
3835 次 |
| 最近记录: |