-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbinding_power.go
More file actions
110 lines (86 loc) · 3.22 KB
/
Copy pathbinding_power.go
File metadata and controls
110 lines (86 loc) · 3.22 KB
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
package parser
import (
"github.com/ProCode-Software/klar/internal/lexer"
)
// BindingPower represents the operator precedence for a type of operator.
type BindingPower int
// TypeScript Reference:
// https://github.com/microsoft/typescript-go/blob/main/internal/ast/precedence.go
const (
DefaultBindingPower BindingPower = iota // Zero
ExpressionBindingPower // Minimum
WhenAsBindingPower // as
ObjectPipelineBindingPower // |.
LogicalBindingPower // ||, &&
WhenOptionBindingPower // |
PipelineBindingPower // |>
RelationalBindingPower // ==, !=, >, <, <=, >=, in, !in
DistributiveBindingPower // and, or
RangeBindingPower // ..., ..<
AdditiveBindingPower // +, -
MultiplicativeBindingPower // *, /, %
UnaryBindingPower // await, go, !
ExponentiationBindingPower // ^ (higher than unary: -2 ^ 3 = -(2 ^ 3))
CallBindingPower // Call: (
MemberBindingPower // Index/Slice: . [
PrimaryBindingPower // Primary expressions (literals)
)
var BindingPowerMap = map[lexer.TokenType]BindingPower{
lexer.As: WhenAsBindingPower,
lexer.StrokeDot: ObjectPipelineBindingPower,
lexer.AndAnd: LogicalBindingPower,
lexer.OrOr: LogicalBindingPower,
lexer.Stroke: WhenOptionBindingPower,
lexer.Pipeline: PipelineBindingPower,
lexer.LessThan: RelationalBindingPower,
lexer.GreaterThan: RelationalBindingPower,
lexer.LessEqualTo: RelationalBindingPower,
lexer.GreaterEqualTo: RelationalBindingPower,
lexer.EqualEqual: RelationalBindingPower,
lexer.NotEqual: RelationalBindingPower,
lexer.In: RelationalBindingPower,
lexer.NotIn: RelationalBindingPower,
lexer.Ellipsis: RangeBindingPower,
lexer.DotDotLessThan: RangeBindingPower,
lexer.And: DistributiveBindingPower,
lexer.Or: DistributiveBindingPower,
lexer.Plus: AdditiveBindingPower,
lexer.Minus: AdditiveBindingPower,
lexer.Asterisk: MultiplicativeBindingPower,
lexer.Slash: MultiplicativeBindingPower,
lexer.Percent: MultiplicativeBindingPower,
lexer.NotNot: UnaryBindingPower,
lexer.Not: UnaryBindingPower, // For error handling
lexer.Caret: ExponentiationBindingPower,
lexer.LeftParenthesis: CallBindingPower,
lexer.Dot: MemberBindingPower,
lexer.LeftBracket: MemberBindingPower,
lexer.String: PrimaryBindingPower,
lexer.Numeric: PrimaryBindingPower,
lexer.Boolean: PrimaryBindingPower,
lexer.Identifier: PrimaryBindingPower,
lexer.Nil: PrimaryBindingPower,
lexer.Underscore: PrimaryBindingPower,
lexer.Regex: PrimaryBindingPower,
}
const (
_ BindingPower = ExpressionBindingPower + iota
DefaultTypeBindingPower
VariadicTypeBindingPower // ...
OptionalTypeBindingPower // ?
UnionTypeBindingPower // |
GenericTypeBindingPower // <
NamespaceTypeBindingPower // .
PrimaryTypeBindingPower // Names
)
var TypeBindingPowerMap = map[lexer.TokenType]BindingPower{
lexer.Question: OptionalTypeBindingPower,
lexer.Stroke: UnionTypeBindingPower,
lexer.LessThan: GenericTypeBindingPower,
lexer.Dot: NamespaceTypeBindingPower,
lexer.Identifier: PrimaryTypeBindingPower,
lexer.Underscore: PrimaryTypeBindingPower,
}
func bpOf(kind lexer.TokenType) BindingPower {
return BindingPowerMap[kind]
}