gpt4 book ai didi

bison - 对 yyparse 的 undefined reference (flex & bison)

转载 作者:行者123 更新时间:2023-12-04 15:27:40 25 4
gpt4 key购买 nike

我正在尝试学习一些 flex/bison,我正在阅读 John Levine (O'Reilly) 的 Flex & Bison。有一个我需要运行的示例,但是由于出现以下错误,我无法运行它:

/tmp/ccKZcRYB.o: In function `yylex':
fb3-1.lex.c:(.text+0x2bd): undefined reference to `yylval'
/tmp/cclBqnOk.o: In function `main':
fb3-1funcs.c:(.text+0x420): undefined reference to `yyparse'
collect2: ld returned 1 exit status

我有四个源文件:

fb3-1.h :
/*
* Declarations for calculator fb3-1
*/

/* Interface to the lexer */
extern int yylineno; /* from lexer */
void yyerror(char *s, ...);

/* nodes in the abstract syntax tree */
struct ast {
int nodetype;
struct ast *l;
struct ast *r;
};

struct numval {
int nodetype; /* type K for constant */
double number;
};

/* build an AST */
struct ast *newast(int nodetype, struct ast *l, struct ast *r);
struct ast *newnum(double d);

/* evaluate an AST */
double eval(struct ast *);

/* delete and free an AST */
void treefree(struct ast *);

fb3-1.l
/* recognise tokens for the calculator */
%option noyywrap nodefault yylineno
%{
#include "fb3-1.h"
#include "fb3-1.tab.h"
%}

/* float exponent */
EXP ([Ee][-+]?[0-9]+)

%%

"+" |
"-" |
"*" |
"/" |
"|" |
"(" |
")" { return yytext[0]; }
[0-9]+"."[0-9]*{EXP}? |
"."?[0-9]+{EXP}? { yylval.d = atof(yytext); return NUMBER; }

\n { return EOL; }
"//".*
[ \t] { /* ignore whitespace */ }
. { yyerror("Mystery character %c\n", *yytext); }
%%

fb3-1.y
/* calculator with AST */

%{
#include <stdio.h>
#include <stdlib.h>
#include "fb3-1.h"
%}

%union {
struct ast *a;
double d;
}

/* declare tokens */
%token <d> NUMBER
%token EOL

%type <a> exp factor term

%%
calclist: /* nothing */
| calclist exp EOL {
printf("=%4.4g\n",eval($2));
treefree($2);
printf("> ");
}

| calclist EOL { printf("> "); } /* blank line or a comment */
;

exp: factor
| exp '+' factor { $$ = newast('+', $1, $3); }
| exp '-' factor { $$ = newast('-', $1, $3); }
;

factor: term
| factor '*' term { $$ = newast('*', $1, $3); }
| factor '/' term { $$ = newast('/', $1, $3); }
;

term: NUMBER { $$ = newnum($1); }
| '|' term { $$ = newast('|', $2, NULL); }
| '(' term { $$ = $2; }
| '-' term { $$ = newast('M', $2, NULL); }
;

%%

fb3-1funcs.c
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include "fb3-1.h"

struct ast * newast(int nodetype, struct ast *l, struct ast *r)
{
struct ast *a = malloc(sizeof(struct ast));

if(!a) {
yyerror("out of space");
exit(0);
}

a->nodetype = nodetype;
a->l = l;
a->r = r;
return a;
}

struct ast * newnum(double d)
{
struct numval *a = malloc(sizeof(struct numval));

if(!a) {
yyerror("out of space");
exit(0);
}

a->nodetype = 'K';
a->number = d;
return (struct ast *)a;
}

double eval (struct ast *a)
{
double v;

switch(a->nodetype) {
case 'K': v = ((struct numval *)a)->number; break;

case '+': v = eval(a->l) + eval(a->r); break;
case '-': v = eval(a->l) + eval(a->r); break;
case '*': v = eval(a->l) + eval(a->r); break;
case '/': v = eval(a->l) + eval(a->r); break;
case '|': v = eval(a->l); if(v < 0) v = -v; break;
case 'M': v = -eval(a->l); break;
default: printf("internal error: bad node %c\n", a->nodetype);
}
}

void treefree(struct ast *a)
{
switch(a->nodetype)
{
/* two subtrees */
case '+':
case '-':
case '*':
case '/':
treefree(a->r);

/* one subtree */
case '|':
case 'M':
treefree(a->l);

/* no subtree */
case 'K':
free(a);
break;

default: printf("internal error: free bad node %c\n", a->nodetype);
}
}

void yyerror(char *s, ...)
{
va_list ap;
va_start(ap, s);

fprintf(stderr, "%d: error: ", yylineno);
vfprintf(stderr, s, ap);
fprintf(stderr, "\n");
}

int main ()
{
printf("> ");
return yyparse();
}

build :
bison -d fb3-1.y
flex -ofb3-1.lex.c fb3-1.l
cc -o $@ fb3-1.tab.c fb3-1.lex.c fb3-1funcs.c

我正在运行 Ubuntu 10.04 x64,安装了“flex”和“bison”包。任何人都知道为什么会发生此错误,以及如何修复它?提前致谢 :)

最佳答案

解决了,命令

cc -o $@ fb3-1.tab.c fb3-1.lex.c fb3-1funcs.c

应该
cc -o fb3 fb3-1.tab.c fb3-1.lex.c fb3-1funcs.c

不知道为什么这本书没有为示例指定这一点。

关于bison - 对 yyparse 的 undefined reference (flex & bison),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3298718/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com