我们有一个家庭作业,我们需要分阶段编写编译器,第一阶段是使用flex和bison。 我们了解到我们可以使用struct覆盖YYSTYPE:
typedef struct data {
char * type;
char * value;
}DATA;
#define YYSTYPE DATA
这是在H文件中写的,我们从flex文件中包含它。
在flex文件中,我们有一个使用yylval变量的函数:
void allocate(char* input_name, char* input_value)
{
yylval.type = (char*) malloc(sizeof(char)*(strlen(input_name)+1));
strcpy( yylval.type, input_name);
yylval.value = (char*) malloc(sizeof(char)*(strlen(input_value)+1));
strcpy( yylval.value, input_value);
}
此功能位于flex文件的最后部分。
在midlle部分,我们调用了函数:
"real" {allocate("real",yytext); return real;}
Bison文件包含所有令牌声明。
当我们尝试编译时,使用以下命令:
bison -d source.ypp
flex part1.lex
g++ source.tab.cpp lex.yy.c
我们得到很多错误,每次调用allocate函数时,它们看起来都一样:
part1.lex:90:错误:请求成员
type' in
yylval',即 非类型的'YYSTYPE'
我们做错了什么?
答案 0 :(得分:1)
您需要在flex和bison输入文件中包含定义YYSTYPE
的标题。