【发布时间】: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) 添加到您的编译命令中。
标签: compiler-construction bison flex-lexer yacc lex