visitor.hpp
Go to the documentation of this file.
1
2#pragma once
3
4#include "core/ast/node.hpp"
5#include "core/ast/src.hpp"
8
9namespace by {
10
11 class retStateExpr;
12#define X(T) class T;
13#include "visitee.inl"
14#undef X
15
20 class _nout visitor: public worker<void, node> {
22 BY(CLASS(visitor, __super6))
23
24 public:
25 visitor();
26 visitor(nbool isReturnable);
27
28 public:
32 void setReturnable(nbool isReturnable);
33 nbool isReturnable() const;
34
35#define X(T) \
36 virtual void visit(const visitInfo& i, T& me); \
37 virtual nbool onVisit(const visitInfo& i, T& me, nbool alreadyVisited); \
38 virtual void onLeave(const visitInfo& i, T& me, nbool alreadyVisited);
39#include "visitee.inl"
40#undef X
41
42 virtual void visit(const visitInfo& i, node& me);
43 virtual nbool onVisit(const visitInfo& i, node& me, nbool alreadyVisited);
44 virtual void onLeave(const visitInfo& i, node& me, nbool alreadyVisited);
45
46 // traverse:
47 // generalized-way:
48 // @ return false if the node is already visited.
49 virtual void onTraverse(const visitInfo& i, node& me);
50 // specific-way:
51 virtual void onTraverse(const visitInfo& i, asExpr& a);
52 virtual void onTraverse(const visitInfo& i, assignExpr& a);
53 virtual void onTraverse(const visitInfo& i, blockExpr& b);
54 virtual void onTraverse(const visitInfo& i, defVarExpr& d);
55 virtual void onTraverse(const visitInfo& i, FBOExpr& f);
56 virtual void onTraverse(const visitInfo& i, getExpr& e);
57 virtual void onTraverse(const visitInfo& i, retExpr& b);
58 virtual void onTraverse(const visitInfo& i, runExpr& e);
59 virtual void onTraverse(runExpr& e, node& subject);
60 virtual void onTraverse(const visitInfo& i, func& f);
61 virtual void onTraverse(const visitInfo& i, frame& f);
62 virtual void onTraverse(const visitInfo& i, forExpr& f);
63 virtual void onTraverse(const visitInfo& i, retStateExpr& r);
64 virtual void onTraverse(const visitInfo& i, ifExpr& f);
65 virtual void onTraverse(const visitInfo& i, whileExpr& w);
66 virtual void onTraverse(const visitInfo& i, defArrayExpr& d);
67 virtual void onTraverse(const visitInfo& i, defNestedFuncExpr& e);
68 virtual void onTraverse(const visitInfo& i, genericOrigin& g);
69 virtual void onTraverse(const visitInfo& i, obj& o);
70
71 protected:
72 void _onWork() override;
73 void _prepare() override;
74
75 private:
77 nbool _markVisited(node& me);
78 void _rel();
79
80 private:
81 // value will be true if key is visited func or obj:
82 // obj usually has huge subs and was chained to its subpack. but subpack also has the
83 // obj as its one of subs, so visitor will fall in the infinite recursive loop.
84 // to prevent it, I prepare a map instance. that map will return true if the key,
85 // func or obj, already got visited.
86 std::map<node*, nbool> _visited;
87 nbool _isReturnable;
88 };
89} // namespace by
Fundamental Binary Operation expression.
Definition: FBOExpr.hpp:17
Type casting expression.
Definition: asExpr.hpp:16
Assignment expression for variable assignment.
Definition: assignExpr.hpp:16
Block expression containing multiple statements.
Definition: blockExpr.hpp:15
arr definition expression
Definition: defArrayExpr.hpp:13
Nested func definition expression (lambda)
Definition: defNestedFuncExpr.hpp:13
Variable definition expression base class.
Definition: defVarExpr.hpp:17
For loop expression.
Definition: forExpr.hpp:14
Execution frame for byeol runtime.
Definition: frame.hpp:29
Function definition in byeol language.
Definition: func.hpp:20
Generic type origin with type parameters.
Definition: genericOrigin.hpp:15
Expression for property and method access.
Definition: getExpr.hpp:17
If conditional expression.
Definition: ifExpr.hpp:13
Base class for all AST nodes in byeol language.
Definition: node.hpp:30
Managed object in byeol programming environment.
Definition: obj.hpp:19
Return statement expression.
Definition: retExpr.hpp:14
Base class for return state expressions.
Definition: retStateExpr.hpp:19
Function/method call expression.
Definition: runExpr.hpp:14
Visitor context information.
Definition: visitInfo.hpp:10
Base visitor class for AST traversal.
Definition: visitor.hpp:20
void setReturnable(nbool isReturnable)
While loop expression.
Definition: whileExpr.hpp:12
Base worker template for processing tasks.
Definition: worker.hpp:28