Bison Can';向量';是否在yacc的yylval中使用?

Bison Can';向量';是否在yacc的yylval中使用?,bison,yacc,Bison,Yacc,我想将yylval定义如下: %union { int ival; char *sval; struct s_con { char exp[30]; vector<Where*> v_wheres; } *p_s_con; } %union{ 国际竞争力; char*sval; 结构s_con{ char-exp[30]; 向量v_在哪里; }*p_s_con; } 这里是,其中是一个类。 然后我在y.tab.

我想将
yylval
定义如下:

%union {
    int ival;
    char *sval;
    struct s_con {
        char exp[30];
        vector<Where*> v_wheres;   
    } *p_s_con;
}
%union{
国际竞争力;
char*sval;
结构s_con{
char-exp[30];
向量v_在哪里;
}*p_s_con;
}
这里是
,其中
是一个类。 然后我在y.tab.h中发现一个错误:
'vector'不命名类型

您不能在Bison解析器堆栈中使用
std::vector
,因为它不是所谓的POD(纯旧数据类型,即整数、浮点数、旧结构、并集和指针)对象。这是一个C++限制。 在BISEN(2.4.3)手册中的“第十节1.2节C++语义值”中,你可以找到:

%union
指令与C指令相同,参见第3.7.4节[值类型集合], 第66页。特别是,它产生了一个真正的
联合
1,它在 C++,

  • 类型
    YYSTYPE
    已定义,但不鼓励使用:您应该参考 解析器的封装类型yy::parser::semantic_类型

  • 不能使用非POD(普通旧数据)类型。C++禁止任何类实例 使用联合中的构造函数:只允许指向此类对象的指针。 由于对象必须通过指针存储,因此不会自动回收内存: 使用
    %destructor
    指令是避免泄漏的唯一方法。参见第3.7.7节[释放 丢弃的符号],第68页

1在未来,允许在伪联合(类似于Boost变体)中使用复杂类型的技术可能会 必须实施这些措施来缓解这些问题


这样,你也许可以使用一个指向<代码>的指针,在这里,指针,但是你必须提供适当的析构函数。< /P>你是否编译成C++解析器?您是否在序言中包含了定义向量的任何标题?我使用命令yacc-d yacc.y获得y.tab.c和y.tab.h。然后我发现所有标题定义都在y.tab.c中,而不是在y.tab.h.Ok中。在bison文件的顶部,在

%{…%}
块中,是否放置了
#include
?标题定义的“#include”在y.tab.c中,而不是在y.tab.h中。也许我可以手动将“#include”添加到y.tab.h中?@slimpig:adding
std::
like
std::vector
解决了这个错误吗?请注意,C++11允许在联合中使用非POD类型,但使它们工作需要骨架中bison的支持