1

我现在正在学习 Bison 并用它编写一个玩具编译器。正如我发现的那样,我可以使用 %union 指令存储不同的值,但遗憾的是 %union 不支持我自己的类。我怎样才能拯救他们?假设我有一个名为object_type; 这个类有几个虚函数和一些继承者,比如bool_typeint_type等等。我可以创建一个指针object_type*,它可以保存任何类型的子类,但它只能保存一个对象;如果我有条件OBJECT AND OBJECT怎么办?如果我要使用 union,我可以使用$1and$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.

4

1 回答 1

1

您可以使用混合解决方案并存储一个包含多个不同类型对象的指针的联合。例如,如果你有int_typebool_type对象,你可以像这样创建一个联合:

%union {
     int_type*  iType;
     bool_type* bType;
     /* ... */
}

这样,如果你有一个像 的产品OBJECT AND OBJECT,你可以有像这样的动作

$$ = new bType($1->memberFunctionOnBool() && $3->memberFunctionOnBool());

希望这可以帮助!

于 2012-12-18T18:34:05.287 回答