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++限制。1.p> 在BISEN(2.4.3)手册中的“第十节1.2节C++语义值”中,你可以找到:
%union
指令与C指令相同,参见第3.7.4节[值类型集合],
第66页。特别是,它产生了一个真正的联合
1,它在
C++,
- 类型
已定义,但不鼓励使用:您应该参考 解析器的封装类型yy::parser::semantic_类型YYSTYPE
- 不能使用非POD(普通旧数据)类型。C++禁止任何类实例
使用联合中的构造函数:只允许指向此类对象的指针。
由于对象必须通过指针存储,因此不会自动回收内存:
使用
指令是避免泄漏的唯一方法。参见第3.7.7节[释放 丢弃的符号],第68页%destructor
这样,你也许可以使用一个指向<代码>的指针,在这里,指针,但是你必须提供适当的析构函数。< /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:addingstd::
likestd::vector
解决了这个错误吗?请注意,C++11允许在联合中使用非POD类型,但使它们工作需要骨架中bison的支持