bison/lex YYSTYPE声明为结构

bison/lex YYSTYPE声明为结构,bison,yacc,lex,Bison,Yacc,Lex,我已经尝试了一段时间,通过使用bison和lex实现语法分析器 我对yylval的类型重新声明有问题,我解释自己 我有4个文件:lexico.l、parser.y、functionestabla.c、functionestabla.h 第一个包含lex的规范 第二,野牛/yacc规范 最后两个是处理符号表的一系列方法 我在FunctioneStabla.h中有: typedef enum { entero, real, caracter, arrayEntero, arrayReal, arra

我已经尝试了一段时间,通过使用bison和lex实现语法分析器

我对yylval的类型重新声明有问题,我解释自己

我有4个文件:lexico.l、parser.y、functionestabla.c、functionestabla.h

第一个包含lex的规范 第二,野牛/yacc规范 最后两个是处理符号表的一系列方法

我在FunctioneStabla.h中有:

typedef enum {
entero,
real,
caracter,
arrayEntero,
arrayReal,
arrayCaracter,
matrizEntero,
matrizReal,
matrizCaracter,
desconocido,
no_asignado
} dtipo ;

typedef struct{
int    atrib ;
char  *lexema ;
dtipo  tipo ;
} atributos;

#define YYSTYPE atributos
我尝试了下一个:

从parser.y开始,在一个规则内,尝试访问yylval.tipo,没有问题

从lexico.l,在令牌规则中,试图访问yylval.lexema(或任何属性),gcc告诉我:

 lexico.l: In function ‘yylex’:
 lexico.l:93: error: request for member ‘lexema’ in something not a structure or union
 make: *** [lex.yy.o] Error 1
有什么建议吗


事先非常感谢,我的英语很抱歉。

我不完全理解您是如何使用struct
atributos
,但我会猜一猜

查看生成的
y.tab.h
文件:我想您会看到为
yylval
生成的代码与您想要使用它的方式不兼容

通常,我看到
YYSTYPE
被定义为一个并集,而不是一个结构。请参阅bison的
%union
指令的文档,以定义语义值的数据类型。我想你想要这样的东西:

%union {
    int    atrib;
    char  *lexema;
    dtipo  tipo;
}

我不完全理解您是如何使用struct
atributos
,但我会猜一猜

查看生成的
y.tab.h
文件:我想您会看到为
yylval
生成的代码与您想要使用它的方式不兼容

通常,我看到
YYSTYPE
被定义为一个并集,而不是一个结构。请参阅bison的
%union
指令的文档,以定义语义值的数据类型。我想你想要这样的东西:

%union {
    int    atrib;
    char  *lexema;
    dtipo  tipo;
}

David是对的,默认情况下,yacc给您一个
%union
指令,但是当它被转换为普通C时,您可以将结构嵌套在其中:

%union {
    struct {
        int atrib;
        char *lexema;
        dtipo tipo;
    };
}

在支持联合内部匿名结构(例如C99)的C方言中,它只会像您所期望的那样工作。

David是对的,默认情况下,yacc给您一个
%union
指令,但是当它转换为普通C时,您可以将结构嵌套在其中:

%union {
    struct {
        int atrib;
        char *lexema;
        dtipo tipo;
    };
}
在支持联合内部匿名结构(例如C99)的C方言中,它将像您所期望的那样工作