我在函数`yylex':lex.yy.c :(。text + 0x2ac)中出错:未定义的引用

时间:2018-03-27 08:14:49

标签: c compiler-construction flex-lexer yacc lex

我是lex和yacc的新手,我正在关注"lex & yacc 1992" book

我在第3章的一个例子中工作,我在编译过程中出错,但我找不到解决方案; 这是代码:

lex file.l:

%{

#include "y.tab.h"
#include "symboletable.h"
#include <math.h>
extern int yylavl;

%}


%%
([0-9]+|([0-9]*\.[0-9]+)([eE][-+]?[0-9]+)?) {
            yylval.dval = atof(yytext);
            return NUMBER;
        }
[ \t] ;       /* ignore whitespace */ 

[A-Za-z][A-Za-z0-9]* { /* return symbol pointer */
            yylval.symp = symlook(yytext);
            return NAME;
        }
"$" { return 0; }
\n |  
. return yytext[0];

%%

这里是yacc file.y

%{
#include "symboletable.h"
#include <string.h>
#include <stdio.h>     /* C declarations used in actions */
int yylex();
void yyerror(const char *s);
%}

%union {
    double dval;
    struct symtab *symp;
}

%token <symp> NAME
%token <dval> NUMBER

%left '+' '-'
%left '*' '/'
%nonassoc UMINUS

%type <dval> expression
%%

statement_list : statement '\n'
               | statement_list statement '\n'
               ;

statement  : expression   { printf("= %g\n", $1); } 
           | NAME '=' expression {$1->value = $3; }
           ;


expression : NAME {$$ = $1->value; }
           | expression '+' expression {$$ = $1 + $3; }
           | expression '-' expression {$$ = $1 - $3; }
           | expression '*' expression {$$ = $1 * $3; }
           | expression '/' expression
                {   if ($3 ==0.0)
                        yyerror("divide by zero");
                    else
                        $$ = $1 / $3; 
                }
           | '-' expression %prec UMINUS {$$ = -$2; }
           | '(' expression ')' {$$ = $2; }
           | NUMBER
           ;
%%

根据书中的例子,我需要编写一个符号表例程,来获取字符串并为字符串分配动态空间,这里是file.h。

symboletable.h

#define NSYMS 20 /* maximum number of symbols */
struct symtab {
        char *name;
        double value;
} symtab[NSYMS];

struct symtab *symlook();

和symboletable.pgm:

/* look up a symbol table entry, add if not present */
struct symtab *
symlook(s)
char *s;
{
    char *p;
    struct symtab *sp;
    for (sp = symtab; sp < &symtab[NSYMS]; sp++){
        /* is it already here ? */
        if (sp->name && !strcmp(sp->name, s))
            return sp;

        /* is it free */
        if (!sp->name){
            sp->name = strdup(s);
            return sp;
        }
        /* otherwise continue to next */
    }
    yyerror("Too many symbols");
    exit(1);    /* cannot continue */
} /* symlook */

现在当我运行以下命令时:

yacc -d file.y 
lex file.l 
cc -c lex.yy.c -o newfile -ll
cc -o new y.tab.c lex.yy.c -ly -ll

但是我得到了错误:

  

/tmp/ccGnPAO2.o:在函数yylex': lex.yy.c:(.text+0x2ac): undefined reference to symlook&#39; collect2:错误:ld返回1退出   状态

所以,为什么我得到那个错误,我完全按照这个例子?

1 个答案:

答案 0 :(得分:0)

您需要在编译命令中包含符号表实现。否则,链接器将如何找到该代码?