代码之家  ›  专栏  ›  技术社区  ›  Tim unnamed eng

未定义对“yylval”和“yyerror”的引用`

  •  3
  • Tim unnamed eng  · 技术社区  · 6 年前

    我正试图从书中汇编一个例子 flex and Bison . 我不明白为什么会出现下面的构建错误,以及如何更正它?谢谢。

    $ make
    bison -d fb1-5.y
    fb1-5.y: warning: 3 shift/reduce conflicts [-Wconflicts-sr]
    flex fb1-5.l
    cc -o  fb1-5.tab.c lex.yy.c -lfl
    fb1-5.l: In function ‘yylex’:
    fb1-5.l:27:3: warning: implicit declaration of function ‘yyerror’; did you mean ‘perror’? [-Wimplicit-function-declaration]
     . { yyerror("Mystery character %c\n", *yytext); }
       ^~~~~~~
       perror
    /tmp/cctl5WLj.o: In function `yylex':
    lex.yy.c:(.text+0x32f): undefined reference to `yylval'
    lex.yy.c:(.text+0x363): undefined reference to `yyerror'
    collect2: error: ld returned 1 exit status
    Makefile:2: recipe for target 'fb1-5' failed
    make: *** [fb1-5] Error 1
    

    Makefile:

    fb1-5:  fb1-5.l fb1-5.y
        bison -d fb1-5.y
        flex fb1-5.l
        cc -o  fb1-5.tab.c lex.yy.c -lfl
    

    FB1-5.Y

    /* simplest version of calculator */
    
    %{
    #  include <stdio.h>
    %}
    
    /* declare tokens */
    %token NUMBER
    %token ADD SUB MUL DIV ABS
    %token OP CP
    %token EOL
    
    %%
    
    calclist: /* nothing */
     | calclist exp EOL { printf("= %d\n> ", $2); }
     | calclist EOL { printf("> "); } /* blank line or a comment */
     ;
    
    exp: factor
     | exp ADD exp { $$ = $1 + $3; }
     | exp SUB factor { $$ = $1 - $3; }
     | exp ABS factor { $$ = $1 | $3; }
     ;
    
    factor: term
     | factor MUL term { $$ = $1 * $3; }
     | factor DIV term { $$ = $1 / $3; }
     ;
    
    term: NUMBER
     | ABS term { $$ = $2 >= 0? $2 : - $2; }
     | OP exp CP { $$ = $2; }
     ;
    %%
    main()
    {
      printf("> "); 
      yyparse();
    }
    
    yyerror(char *s)
    {
      fprintf(stderr, "error: %s\n", s);
    }
    

    FB1-5.L:

    /* recognize tokens for the calculator and print them out */
    
    %{
    # include "fb1-5.tab.h"
    %}
    
    %%
    "+" { return ADD; }
    "-" { return SUB; }
    "*" { return MUL; }
    "/" { return DIV; }
    "|"     { return ABS; }
    "("     { return OP; }
    ")"     { return CP; }
    [0-9]+  { yylval = atoi(yytext); return NUMBER; }
    
    \n      { return EOL; }
    "//".*  
    [ \t]   { /* ignore white space */ }
    .   { yyerror("Mystery character %c\n", *yytext); }
    %%
    
    3 回复  |  直到 6 年前
        1
  •  3
  •   Ctx    6 年前

    fb1-5:  fb1-5.l fb1-5.y
        bison -b fb1-5 -d fb1-5.y
        flex fb1-5.l
        gcc -o fb1-5 fb1-5.tab.c lex.yy.c -lfl -ly
    

        2
  •  2
  •   Spinkoo    6 年前

    cc -o   lex.yy.c  fb1-5.tab.c -lfl
    
        3
  •  2
  •   rici    6 年前

    1. yyerror

    2. cc -o fb1-5.tab.c lex.yy.c -lfl lex.yy.c fb1-5.tab.c