【问题标题】:Use of undeclared identifier 'yylval'使用未声明的标识符“yylval”
【发布时间】:2021-12-04 11:05:09
【问题描述】:

我试图在 lex 和 yacc 中运行这个程序。我在 Macbook Pro 上工作。

我不明白为什么无法识别 lex 文件中的 yylval; 有人知道我应该在这里做什么吗? 我可能需要添加一些包含或其他内容?我确实在互联网上找到了这样的东西:

lex 文件:

%% 

August { yylval = 8; return AUGUST; }
September { yylval = 9; return SEPTEMBER; }
October { yylval = 10; return OCTOBER; }
November { yylval = 11; return NOVEMBER; } 
December  { yylval = 12; return DECEMBER; }
20[0-9][0-9]        { yylval = atoi(yytext); return YEAR; }
.        return yytext[0];
%%

yacc 文件:

%{
  
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#include "lex.yy.c"


int yylex(void);
int yyerror();

%}


%token AUGUST SEPTEMBER OCTOBER NOVEMBER DECEMBER 
%token YEAR

%%

s: month '#' YEAR

{
    printf("%d  %d\n",$1,$3);
    printf("DATE IS OK\n");
}

month  :  AUGUST {$$ = $1;}
      |  SEPTEMBER {$$ = $1;}
      |  OCTOBER {$$ = $1;}
      |  NOVEMBER {$$ = $1;}
      |  DECEMBER{$$ = $1;}
%%



int main(){
    return yyparse();
}

int yyerror(){
    printf("Error in date\n");
    return 0;
}

当我运行它时

lex file.l 
yacc file.y
gcc -o file y.tab.c -ll

这是我得到的错误!:

In file included from test.y:8:
test.l:3:3: error: use of undeclared identifier 'yylval'
{ yylval = 8; return AUGUST; }
  ^
test.l:4:3: error: use of undeclared identifier 'yylval'
{ yylval = 9; return SEPTEMBER; }
  ^
test.l:5:3: error: use of undeclared identifier 'yylval'
{ yylval = 10; return OCTOBER; }
  ^
test.l:6:3: error: use of undeclared identifier 'yylval'
{ yylval = 11; return NOVEMBER; } 
  ^
test.l:7:3: error: use of undeclared identifier 'yylval'
{ yylval = 12; return DECEMBER; }
  ^
test.l:8:3: error: use of undeclared identifier 'yylval'
{ yylval = atoi(yytext); return YEAR; }
  ^
6 errors generated.

【问题讨论】:

  • 我认为您需要找到更好的指南。不要把它放在你的 yacc 文件中:#include "lex.yy.c"。这是错误的,如果您在假设的示例中看到它,您可能应该找到不同的来源。
  • 您需要在您的 lex 文件中生成一个 yacc 头文件(-d 选项)和#include 它(header 文件,y.tab.h)。由于您使用atoi,因此您还需要在您的 lex 文件中包含一些其他内容。并且您需要将生成的扫描仪 (lex.yy.c) 添加到您的编译命令中。
  • 值得阅读bisonflex 手册的前几节。 (这些手册适用于最新版本。如果您使用 Mac,您可能拥有旧版本的 bison 和 flex,您应该升级它们。)

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


【解决方案1】:

如果您在 yacc/bison 文件中使用 #include "lex.yy.c" 的方法,那么您应该将 include 行放在 yacc/bison 文件的 底部。然后在被 lex/flex 生成的代码引用之前,yacc/bison 将做出声明。

是的;如 cmets 中所述,还有其他解决此问题的方法,但也有许多文本和示例使用了这种方法,学生正在从中学习。

您会发现我的方法可以解决问题,尽管我也同意 cmets 中列出的其他方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多