我想按如下方式定义yylval
:
%union {
int ival;
char *sval;
struct s_con {
char exp[30];
vector<Where*> v_wheres;
} *p_s_con;
}
这里Where
是一个类。
然后我在y.tab.h中发现错误:
'vector’ does not name a type
答案 0 :(得分:3)
你不能在Bison解析器堆栈中使用std::vector
,因为它不是所谓的POD(普通旧数据类型,它是整数,浮点数,旧结构,联合和指针)对象。这是C ++的限制。
答案 1 :(得分:2)
在Bison(2.4.3)手册的第10.1.2节'C ++语义值'中,您可以找到:
%union
指令与C一样,参见第3.7.4节[值类型集合], 第66页。特别是它产生了一个真正的union
1 ,它具有一些特定的功能。 C ++。
已定义类型
YYSTYPE
,但不建议使用它:相反,您应该参考 解析器的封装类型yy :: parser :: semantic_type。不能使用非POD(普通旧数据)类型。 C ++禁止任何类的实例 使用联合中的构造函数:只允许指向此类对象的指针。 因为对象必须通过指针存储,所以内存不会自动回收: 使用
%destructor
指令是避免泄漏的唯一方法。请参见第3.7.7节[释放 废弃的符号],第68页。1 将来允许在伪联合中使用复杂类型的技术(类似于Boost变体)可能 实施以减轻这些问题。
所以,您可以使用指向Where
指针向量的指针,但是您必须提供适当的析构函数。