C 未定义对'的引用;yylex';野牛误差

C 未定义对'的引用;yylex';野牛误差,c,bison,flex-lexer,C,Bison,Flex Lexer,大家好,我是bison和flex的新手,我正在尝试创建一个简单的计算器,但是在尝试编译时似乎出现了错误 以下是我的flex.l文件(名为a.l): 下面是我的bison.y文件(名为a.y): 我得到的错误是: 我还收到以下警告: 有谁能向我解释为什么会出现这些错误/警告吗?将生成两个C文件,一个由flex生成,另一个由bison生成。由flex创建的一个将被称为“lex.yy.c”,您也需要编译它。您好,我已经尝试了这些命令,但仍然收到错误flex a.l gcc-o a-lex.exe le

大家好,我是bison和flex的新手,我正在尝试创建一个简单的计算器,但是在尝试编译时似乎出现了错误

以下是我的flex.l文件(名为a.l):

下面是我的bison.y文件(名为a.y):

我得到的错误是:

我还收到以下警告:


有谁能向我解释为什么会出现这些错误/警告吗?

将生成两个C文件,一个由
flex
生成,另一个由
bison
生成。由flex创建的一个将被称为“lex.yy.c”,您也需要编译它。

您好,我已经尝试了这些命令,但仍然收到错误flex a.l gcc-o a-lex.exe lex.yy.c-lfl bison a.y gcc a.tab.c lex.yy.c-lfl-o a.exe您需要同时编译这两个c文件<代码>gcc-o a-Wall a.tab.c lex.yy.c-lfl
%{
#include "a.tab.h"
%}
number  [0-9]+

%%

"+"     {return ADD;}
"-"     {return SUB;}
"*"     {return MUL;}
"/"     {return DIV;}
"|"     {return ABS;}
{number}     { return NUMBER;}
\n      {return EOF;}
[ \t]   { }
.    {printf("Mystery Character %s\n", yytext); }

%%
%{
#include <stdio.h>
int yyparse(void);
%}

%token NUMBER ADD SUB MUL DIV ABS EOL

%%

calclist: /*nothing*/ | calclist exp EOL { printf("=%d\n, $1") };

exp: factor
    | exp ADD factor { $$ = $1 + $3; }
    | exp SUB factor { $$ = $1 - $3; }
    ;

factor: term |
        | factor MUL term { $$ = $1 * $3; }
        | factor DIV term { $$ = $1 / $3; }

term: NUMBER
    | ABS term { $$ = $2 >= 0? $2 : - $2; }
    ;

%%

int main(void)
{
    return(yyparse());
}

void yyerror(char *s)
{
    fprintf(stderr, "Error : Exiting %s\n", s);
}
flex a.l
bison a.y
gcc a.tab.c -lfl -o a.exe
a.tab.c:(.text+0x1f2): undefined reference to `yylex'
collect2.exe: error: ld returned 1 exit status
a.tab.c: In function 'yyparse':
a.tab.c:595:16: warning: implicit declaration of function 'yylex' [-Wimplicit-function-declaration]
# define YYLEX yylex ()
               ^
a.tab.c:1240:16: note: in expansion of macro 'YYLEX'
       yychar = YYLEX;
                ^~~~~
a.tab.c:1396:7: warning: implicit declaration of function 'yyerror' [-Wimplicit-function-declaration]
       yyerror (YY_("syntax error"));
       ^~~~~~~
a.y: At top level:
a.y:32:6: warning: conflicting types for 'yyerror'
 void yyerror(char *s)
      ^~~~~~~
a.tab.c:1396:7: note: previous implicit declaration of 'yyerror' was here
       yyerror (YY_("syntax error"));
       ^~~~~~~