我现在正在学习Bison并用它编写玩具编译器。正如我发现我可以使用%union指令存储不同的值,但遗憾的是%union不支持我自己的类。我怎么能保存它们?假设我有一个名为object_type
的基类;这个类有几个虚函数和一些继承者,如bool_type
,int_type
等。
我可以创建一个指针object_type*
,它可以包含任何类型的子类,但它只能包含一个对象;如果我有条件,例如OBJECT AND OBJECT
?如果我将使用union,我可以使用$1
和$3
来获取值;但我更愿意使用我自己的类型,这些类型具有我需要的功能。可以有解决方案吗?提前谢谢!
%{
#include <iostream>
using namespace std;
extern "C" {
int yylex(void);
int yyparse(void);
int yywrap() { return 1; }
} /* extern "C" */
void yyerror(const char *error) {
cerr << error << endl;
} /* error handler */
%}
/*============================================================================*/
/* Create Bison union and stack */
/*============================================================================*/
%code requires {
#ifndef __TYPES_HPP_INCLUDED__
#define __TYPES_HPP_INCLUDED__
#include "types.hpp"
#endif
}
%union {
object_type* pointer;
none_type* none_buffer;
bool_type* bool_buffer;
int_type* int_buffer;
float_type* float_buffer;
bytes_type* bytes_buffer;
} /* union */
g ++返回此错误:error: ‘bool_type’ does not name a type
。
答案 0 :(得分:1)
您可以使用混合解决方案并存储一个包含指向多个不同类型对象的指针的联合。例如,如果您有int_type
和bool_type
个对象,则可以创建一个这样的联合:
%union {
int_type* iType;
bool_type* bType;
/* ... */
}
这样,如果你有像OBJECT AND OBJECT
这样的作品,你就可以有像
$$ = new bType($1->memberFunctionOnBool() && $3->memberFunctionOnBool());
希望这有帮助!