架构x86_64的未定义符号:“_ yylval”,在Mac OS上从_yylex引用

时间:2013-03-11 20:53:59

标签: macos bison flex-lexer

我正在试用O'Reilly Flex& amp;野牛。我正在尝试的第一个Bison和Flex程序在链接源时给出了下一个错误:

  

架构x86_64的未定义符号:“_ yylval”,引用

     

从:

  _yylex in lex-0qfK1M.o

由于我是Mac的新手,我只是在尝试这些例子,我不知道这里有什么问题。

l file:

/* recognize tokens for the calculator and print them out */
%{
#include "fb1-5.tab.h"
%}

%%
"+"     { return ADD; }
"-"     { return SUB; }
"*"     { return MUL; }
"/"     { return DIV; }
"|"     { return ABS; }
[0-9]+  { yylval = atoi(yytext); return NUMBER; }
\n      { return EOL; }
[ \t]   { /* Ignore whitespace */ }
.       { printf("Mystery character %c\n", *yytext); }
%%

y file:

/* simplest version of calculator */
%{
#include <stdio.h>
%}
/* declare tokens */
%token NUMBER
%token ADD SUB MUL DIV ABS
%token EOL
%%
calclist: /* nothing */ matches at beginning of input
 | calclist exp EOL { printf("= %d\n", $1); } EOL is end of an expression
 ;
exp: factor default $$ = $1
 | exp ADD factor { $$ = $1 + $3; }
 | exp SUB factor { $$ = $1 - $3; }
 ;
factor: term default $$ = $1
 | factor MUL term { $$ = $1 * $3; }
 | factor DIV term { $$ = $1 / $3; }
 ;
term: NUMBER default $$ = $1
 | ABS term { $$ = $2 >= 0? $2 : - $2; }
 ;
%%
main(int argc, char **argv)
{
    yyparse();
}

yyerror(char *s)
{
    fprintf(stderr, "error: %s\n", s);
}

命令行:

bison -d fb1-5.y
flex fb1-5.l
cc -o $@ fb1-5.tab.c lex.yy.c -ll

我使用-ll而不是-lfl,因为显然在Mac OS x上,fl库不存在。

输出:

Undefined symbols for architecture x86_64:
  "_yylval", referenced from:
      _yylex in lex-0qfK1M.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

我通过编译一个开始的

的lex文件引起了类似的错误
%{
#include "y.tab.h"
%}

使用命令

gcc -ll lex.yy.c

这有效:

gcc -ll y.tab.c lex.yy.c

发生了什么事?在y.tab.h中有一个声明

extern int yylval

允许lex.yy.c编译。但是,lex.yy.o需要链接到包含yylval的目标文件,例如y.tab.o

答案 1 :(得分:0)

显然是Flex&amp;来自O'Reilly的野牛书充满了错误。

请参阅http://oreilly.com/catalog/errataunconfirmed.csp?isbn=9780596155988

非常奇怪,他们甚至不打扰自己的例子......

部分问题在Undefined reference to yyparse (flex & bison)解决,但不是一切。请参阅errataunconfirmed页面。