-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtokenizer_literals.go
71 lines (56 loc) · 1.24 KB
/
tokenizer_literals.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
package golex
import (
"slices"
)
var (
cachedLiteralToken *Token
)
type LiteralTokenizerCacheKey string
type LiteralTokenizer struct{}
func (t LiteralTokenizer) CanTokenize(l *Lexer) bool {
pos := l.GetPosition()
for _, literal := range l.LiteralTokens {
if l.NextCharsAre([]rune(literal.Literal)) {
cachedLiteralToken = &Token{
Type: literal.Type,
Literal: literal.Literal,
Position: pos,
}
return true
}
}
return false
}
func (t LiteralTokenizer) Tokenize(l *Lexer) (Token, error) {
if cachedLiteralToken != nil {
token := *cachedLiteralToken
cachedLiteralToken = nil
return token, nil
}
return Token{
Type: TypeInvalid,
Literal: string(l.CharAtCursor()),
Position: l.GetPosition(),
}, nil
}
// ###################################################
// # Utils
// ###################################################
func SortLiteralTokens(tokens []LiteralToken) []LiteralToken {
slices.SortFunc[[]LiteralToken, LiteralToken](tokens, func(a, b LiteralToken) int {
aLen := len(a.Literal)
bLen := len(b.Literal)
if aLen < bLen {
return 1
}
if aLen > bLen {
return -1
}
return 0
})
return tokens
}
type LiteralToken struct {
Type TokenType
Literal string
}