-
Notifications
You must be signed in to change notification settings - Fork 0
/
expr.go
146 lines (119 loc) · 2.82 KB
/
expr.go
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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
// Generated file, do not modify
// Invocation: gen_ast -spec ./cmd/gen_ast/expr.spec -dest expr.go -extensions typename
package lox
type Expr interface {
Accept(v exprVisitor)
TypeName() string
}
type exprVisitor interface {
VisitBinaryExpr(e *BinaryExpr)
VisitGroupingExpr(e *GroupingExpr)
VisitLiteralExpr(e *LiteralExpr)
VisitUnaryExpr(e *UnaryExpr)
VisitVariableExpr(e *VariableExpr)
VisitAssignmentExpr(e *AssignmentExpr)
VisitLogicExpr(e *LogicExpr)
VisitCallExpr(e *CallExpr)
VisitFunctionExpr(e *FunctionExpr)
VisitGetExpr(e *GetExpr)
VisitSetExpr(e *SetExpr)
VisitThisExpr(e *ThisExpr)
}
type BinaryExpr struct {
Left Expr
Operator Token
Right Expr
}
type GroupingExpr struct {
Expression Expr
}
type LiteralExpr struct {
Token Token
Value any
}
type UnaryExpr struct {
Operator Token
Right Expr
}
type VariableExpr struct {
Name Token
}
type AssignmentExpr struct {
Name Token
Value Expr
}
type LogicExpr struct {
Left Expr
Operator Token
Right Expr
}
type CallExpr struct {
Callee Expr
Paren Token
Args []Expr
}
type FunctionExpr struct {
Keyword Token
Params []Token
Body []Stmt
}
type GetExpr struct {
Object Expr
Name Token
}
type SetExpr struct {
Object Expr
Name Token
Value Expr
}
type ThisExpr struct {
Keyword Token
}
func (e *BinaryExpr) Accept(v exprVisitor) {
v.VisitBinaryExpr(e)
}
func (e *GroupingExpr) Accept(v exprVisitor) {
v.VisitGroupingExpr(e)
}
func (e *LiteralExpr) Accept(v exprVisitor) {
v.VisitLiteralExpr(e)
}
func (e *UnaryExpr) Accept(v exprVisitor) {
v.VisitUnaryExpr(e)
}
func (e *VariableExpr) Accept(v exprVisitor) {
v.VisitVariableExpr(e)
}
func (e *AssignmentExpr) Accept(v exprVisitor) {
v.VisitAssignmentExpr(e)
}
func (e *LogicExpr) Accept(v exprVisitor) {
v.VisitLogicExpr(e)
}
func (e *CallExpr) Accept(v exprVisitor) {
v.VisitCallExpr(e)
}
func (e *FunctionExpr) Accept(v exprVisitor) {
v.VisitFunctionExpr(e)
}
func (e *GetExpr) Accept(v exprVisitor) {
v.VisitGetExpr(e)
}
func (e *SetExpr) Accept(v exprVisitor) {
v.VisitSetExpr(e)
}
func (e *ThisExpr) Accept(v exprVisitor) {
v.VisitThisExpr(e)
}
func (*BinaryExpr) TypeName() string { return "binary" }
func (*GroupingExpr) TypeName() string { return "grouping" }
func (*LiteralExpr) TypeName() string { return "literal" }
func (*UnaryExpr) TypeName() string { return "unary" }
func (*VariableExpr) TypeName() string { return "variable" }
func (*AssignmentExpr) TypeName() string { return "assignment" }
func (*LogicExpr) TypeName() string { return "logic" }
func (*CallExpr) TypeName() string { return "call" }
func (*FunctionExpr) TypeName() string { return "function" }
func (*GetExpr) TypeName() string { return "get" }
func (*SetExpr) TypeName() string { return "set" }
func (*ThisExpr) TypeName() string { return "this" }