Сейчас я изучаю 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
,
Вы можете использовать гибридное решение и хранить объединение, которое содержит указатели на объекты различных типов. Например, если у вас есть int_type
а также bool_type
объекты, вы можете создать союз, как это:
%union {
int_type* iType;
bool_type* bType;
/* ... */
}
Таким образом, если у вас есть производство, как OBJECT AND OBJECT
Вы могли бы иметь такие действия, как
$$ = new bType($1->memberFunctionOnBool() && $3->memberFunctionOnBool());
Надеюсь это поможет!
Других решений пока нет …