野牛/ YYSTYPE法宣布为结构(bison/lex YYSTYPE declaration as

2019-09-17 11:01发布

我一直在尝试了一段时间,通过使用野牛和以法实施语法解析器。

我有一个的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

任何建议?

非常感谢提前,并且,我的英语很抱歉。

Answer 1:

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

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

正如你在支持工会内部的匿名结构C方言(C99为例)预计将简单的工作。



Answer 2:

我不完全了解你是如何使用的结构atributos ,但我会采取一种猜测。

看看你产生y.tab.h文件:我想你会看到,生成的代码yylval是您要使用的方式不兼容。

通常情况下,我看到YYSTYPE定义为一个工会,而不是一个结构。 看看野牛的文档%union指令来定义的数据类型的语义值。 我想你想是这样的:

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


文章来源: bison/lex YYSTYPE declaration as struct
标签: bison yacc lex