2012-05-23 98 views
2

我一直在尝试一段时间,通过使用bison和lex实现语法分析器。bison/lex YYSTYPE声明为struct

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

我有4个文件:lexico.l,parser.y,funcionesTabla.c,funcionesTabla.h

第一个,包含了野牛/ yacc的 最后两对法 第二个规格,规格,是一组处理符号表的方法。

我在funcionesTabla.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 

什么建议吗?

非常感谢,并对我的英语感到抱歉。

回答

0

大卫是正确的,默认情况下YACC给你一个%union指令,但看到这个被转换为纯C,你可以只窝的结构中有:

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

它可以像支持工会内部匿名结构的C语言一样简单地工作(例如C99)。

-2

我不完全理解你如何使用结构atributos,但我会猜测。

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

通常,我将YYSTYPE定义为联合,而不是结构。查看野牛%union指令的文档,为您的语义值定义数据类型。我想你想是这样的:

%union { 
    int atrib; 
    char *lexema; 
    dtipo tipo; 
} 
相关问题