3

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

我对 yylval 的类型重新声明有疑问,我自己解释一下。

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

第一个,包含 lex 的规范 第二个,bison/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

有什么建议吗?

提前非常感谢,对不起我的英语。

4

2 回答 2

1

大卫是对的,默认情况下 yacc 会给你一个%union指令,但是看到它被翻译成纯 C,你可以把你的结构嵌套在那里:

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

在支持联合内部匿名结构(例如 C99)的 C 方言中,这将像您期望的那样简单地工作。

于 2012-10-19T06:19:03.777 回答
-1

我不完全了解您如何使用 struct atributos,但我会猜测一下。

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

通常,我认为YYSTYPE定义为联合,而不是结构。查看 bison%union指令的文档以定义语义值的数据类型。我想你想要这样的东西:

%union {
    int    atrib;
    char  *lexema;
    dtipo  tipo;
}
于 2012-05-24T02:00:43.413 回答