对于联合类型,'YYSTYPE'没有名为' - '的成员

时间:2013-11-10 15:54:07

标签: c parsing yacc lex

我已将YYSTYPE联盟声明为

%union
{
        char* stringValue;
        union int_double_string* ids;
}

int_double_string被声明为

union int_double_string
{
        short type;     //0:int 1:double 2:string
        int intValue;
        double doubleValue;
        char* stringValue;
};

一些令牌

%token <stringValue> KEY
%token <int_double_string> VALUE
%token <stringValue> COMMENT    
%type <stringValue> pair
%type <int_double_string> key_expr

但是,无论我使用令牌VALUE,它都会给我带来常见错误。

‘YYSTYPE’ has no member named ‘int_double_string’

pair:
        KEY ws '=' ws VALUE     {
                char S5[15];
                addPair($1, $5);   //Error here and where-ever I use $5 in this function
                ...

为什么这样,虽然我已经正确宣布了?我也在我的lex文件中使用了这个变量。它没有显示任何错误。

lex文件

{integer}       {
                yylval.ids = malloc(sizeof(union int_double_string));
                yylval.ids->type = 0;
                yylval.ids->intValue = atoi(yytext);
                return VALUE;
        }

我认为它与联盟内部的联合概念有关。

怎么办?

1 个答案:

答案 0 :(得分:2)

‘YYSTYPE’ has no member named ‘int_double_string’

%type <id>%token <id>中的ID必须是yyunion中的字段。

因此,定义为int_double_string类型的标记需要是类型ids

%token <int_double_string> VALUE
%type <int_double_string> key_expr
像这样

%token <ids> VALUE
%type <ids> key_expr

addPair的第二个参数应为union int_double_string*

在典型的yacc使用中,您将放置所有这些字段:

short type;     //0:int 1:double 2:string
int intValue;
double doubleValue;
char *stringVal;

进入yyunion本身并且在yyunion中没有联盟领域。我不是说你不能,但这很不寻常。