'vector'可以用于yacc的yylval吗?

时间:2011-11-23 03:47:58

标签: bison yacc

我想按如下方式定义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

2 个答案:

答案 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指针向量的指针,但是您必须提供适当的析构函数。