bison/lex YYSTYPE声明为结构
我已经尝试了一段时间,通过使用bison和lex实现语法分析器 我对yylval的类型重新声明有问题,我解释自己 我有4个文件:lexico.l、parser.y、functionestabla.c、functionestabla.h 第一个包含lex的规范 第二,野牛/yacc规范 最后两个是处理符号表的一系列方法 我在FunctioneStabla.h中有: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
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方言中,它将像您所期望的那样工作