1 #ifndef CYMOCA_AST_NODE_H_
2 #define CYMOCA_AST_NODE_H_
16 void enter(listener::Base &listener) override { listener.enter(this); } \
17 void exit(listener::Base &listener) override { listener.exit(this); }
19 namespace cymoca::ast {
45 virtual std::unique_ptr<INode>
clone()
const = 0;
51 auto n = this->
clone();
52 auto p = std::unique_ptr<T>(
dynamic_cast<T *
>(n.get()));
62 template <
class Left,
class Right,
class Base>
69 TBinary(std::unique_ptr<Left> left, std::unique_ptr<Right> right)
78 return std::make_unique<T>(
79 dynamic_cast<INode *
>(
m_left.get())->cloneAs<Left>(),
87 template <
class Right,
class Base>
98 return std::make_unique<T>(
106 template <
class Item,
class Base>
109 std::vector<std::unique_ptr<Item>>
m_list{};
113 void append(std::unique_ptr<Item> item) {
m_list.push_back(std::move(item)); }
114 std::vector<std::unique_ptr<Item>> &
list() {
return m_list; };
115 template <
class Arg1,
class... Args>
116 explicit TList(Arg1 arg1, Args... args) {
117 m_list.push_back(move(arg1));
119 int dummy[1 +
sizeof...(Args)] = {0, (
m_list.push_back(move(args)), 0)...};
123 std::vector<INode *> v;
125 v.push_back(c.get());
131 auto res = std::make_unique<T>();
132 for (
auto &item :
m_list) {
133 auto p =
static_cast<INode *
>(item.get())->cloneAs<Item>();
134 res->m_list.push_back(move(p));
136 return std::move(res);
148 namespace condition {
164 namespace expression {
178 namespace statement {
189 struct hash<cymoca::ast::INode> {
191 return hash<int>()(
size_t(&obj));
std::unique_ptr< INode > cloneUnary() const
void append(std::unique_ptr< Item > item)
std::vector< INode * > getChildren() override
std::unique_ptr< T > cloneAs()
size_t operator()(const cymoca::ast::INode &obj) const
virtual std::unique_ptr< INode > clone() const =0
TUnary(std::unique_ptr< Right > right)
virtual std::vector< INode * > getChildren()=0
std::unique_ptr< Right > m_right
std::unique_ptr< INode > cloneBinary() const
std::vector< std::unique_ptr< Item > > m_list
std::unique_ptr< Left > m_left
std::unique_ptr< Right > m_right
TBinary(std::unique_ptr< Left > left, std::unique_ptr< Right > right)
std::vector< std::unique_ptr< Item > > & list()
std::vector< INode * > getChildren() override
std::vector< INode * > getChildren() override
std::unique_ptr< INode > cloneList() const
TList(Arg1 arg1, Args...args)
virtual void enter(listener::Base &listener)=0
virtual void exit(listener::Base &listener)=0