Зубр: магазин пользовательских классов

Сейчас я изучаю Bison и пишу игрушечный компилятор с ним. Как я обнаружил, я могу хранить разные значения, используя директиву% union, но, к сожалению,% union не поддерживает мои собственные классы. Как я могу сохранить их? Допустим, у меня есть один базовый класс, который называется object_type; этот класс имеет несколько виртуальных функций и некоторые наследники, такие как bool_type, int_type, так далее.
Я могу создать указатель object_type* который может содержать любой тип подкласса, но он может содержать только один объект; Что делать, если у меня есть условие, например OBJECT AND OBJECT? Если я буду использовать союз, я могу просто использовать $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,

1

Решение

Вы можете использовать гибридное решение и хранить объединение, которое содержит указатели на объекты различных типов. Например, если у вас есть int_type а также bool_type объекты, вы можете создать союз, как это:

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

Таким образом, если у вас есть производство, как OBJECT AND OBJECTВы могли бы иметь такие действия, как

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

Надеюсь это поможет!

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector