野牛:存储自定义课程

bison: store custom classes

本文关键字:自定义 存储 野牛      更新时间:2023-10-16

我现在正在学习野牛并用它编写玩具编译器。正如我发现,我可以使用%Union指令存储不同的值,但可悲的是,Union不支持我自己的课程。我该如何保存它们?假设我有一个称为object_type的基类;该类具有几个虚拟功能,以及一些继承,例如bool_typeint_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

您可以使用混合解决方案并存储一个将指针固定到多种不同类型的对象的联合。例如,如果您具有int_typebool_type对象,则可以创建这样的联合:

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

这样,如果您有像OBJECT AND OBJECT这样的作品,则可以采取

之类的动作
$$ = new bType($1->memberFunctionOnBool() && $3->memberFunctionOnBool());

希望这会有所帮助!