-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathVisitor.h
114 lines (97 loc) · 4 KB
/
Visitor.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#ifndef VISITOR_H
#define VISITOR_H
#include <string>
#include <vector>
namespace lx {
class Env;
class Expr;
class Integer;
class Float;
class Symbol;
class Boolean;
class List;
class ConsExpr;
class ListOpExpr;
class ArithmeticExpr;
class RelationExpr;
class DefineExpr;
class LetExpr;
class BeginExpr;
class IfExpr;
class CondExpr;
class ElseExpr;
class LambdaExpr;
class IVisitor
{
public:
virtual ~IVisitor () = default;
virtual Expr* run (Integer* number, Env& env) = 0;
virtual Expr* run (Float* number, Env& env) = 0;
virtual Expr* run (Symbol* sym, Env& env) = 0;
virtual Expr* run (Boolean* sym, Env& env) = 0;
virtual Expr* run (List* list, Env& env) = 0;
virtual Expr* run (ConsExpr* expr, Env& env) = 0;
virtual Expr* run (ListOpExpr* expr, Env& env) = 0;
virtual Expr* run (ArithmeticExpr* expr, Env& env) = 0;
virtual Expr* run (RelationExpr* expr, Env& env) = 0;
virtual Expr* run (DefineExpr* expr, Env& env) = 0;
virtual Expr* run (LetExpr* expr, Env& env) = 0;
virtual Expr* run (BeginExpr* expr, Env& env) = 0;
virtual Expr* run (IfExpr* expr, Env& env) = 0;
virtual Expr* run (CondExpr* expr, Env& env) = 0;
virtual Expr* run (ElseExpr* expr, Env& env) = 0;
virtual Expr* run (LambdaExpr* expr, Env& env) = 0;
};
class Debugger final : public IVisitor
{
public:
Debugger () = default;
Expr* call (Expr* expr);
Expr* run_relation_proc (RelationExpr* expr, Env& env);
template <typename T>
Expr* run_substr_proc (T* expr, Env& env);
Expr* run_specific_proc (List* expr, Env& env);
Expr* run (Integer* number, Env& env) override;
Expr* run (Float* number, Env& env) override;
Expr* run (Symbol* sym, Env& env) override;
Expr* run (Boolean* sym, Env& env) override;
Expr* run (List* list, Env& env) override;
Expr* run (ConsExpr* expr, Env& env) override;
Expr* run (ListOpExpr* expr, Env& env) override;
Expr* run (ArithmeticExpr* expr, Env& env) override;
Expr* run (RelationExpr* expr, Env& env) override;
Expr* run (DefineExpr* expr, Env& env) override;
Expr* run (LetExpr* expr, Env& env) override;
Expr* run (BeginExpr* expr, Env& env) override;
Expr* run (LambdaExpr* expr, Env& env) override;
Expr* run (IfExpr* expr, Env& env) override;
Expr* run (CondExpr* expr, Env& env) override;
Expr* run (ElseExpr* expr, Env& env) override;
};
class Eval final : public IVisitor
{
private:
Expr* run_proc (ArithmeticExpr* arithExpr, std::vector<Expr*>& args, Env& env);
Expr* run_proc (LambdaExpr* lambda, std::vector<Expr*>& args, Env& env);
public:
Eval () = default;
Expr* call (Expr* expr, Env& env);
Expr* run (Integer* number, Env& env) override;
Expr* run (Float* number, Env& env) override;
Expr* run (Symbol* sym, Env& env) override;
Expr* run (Boolean* sym, Env& env) override;
Expr* run (List* list, Env& env) override;
Expr* run (ConsExpr* expr, Env& env) override;
Expr* run (ListOpExpr* expr, Env& env) override;
Expr* run (ArithmeticExpr* expr, Env& env) override;
Expr* run (RelationExpr* expr, Env& env) override;
Expr* run (DefineExpr* expr, Env& env) override;
Expr* run (LetExpr* expr, Env& env) override;
Expr* run (BeginExpr* expr, Env& env) override;
Expr* run (LambdaExpr* expr, Env& env) override;
Expr* run (IfExpr* expr, Env& env) override;
Expr* run (CondExpr* expr, Env& env) override;
Expr* run (ElseExpr* expr, Env& env) override;
};
}
#endif // VISITOR_H