flex,bison和YYSTYPE错误

时间:2013-12-03 13:46:18

标签: g++ bison flex-lexer

我们有一个家庭作业,我们需要分阶段编写编译器,第一阶段是使用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'

我们做错了什么?

1 个答案:

答案 0 :(得分:1)

您需要在flex和bison输入文件中包含定义YYSTYPE的标题。