match - tokeniser.go
1 package match
2
3 import (
4 "errors"
5
6 "vimagination.zapto.org/parser"
7 )
8
9 const (
10 tokenStart parser.TokenType = iota
11 tokenEnd
12 tokenChar
13 tokenAnyChar
14 tokenRepeat
15 )
16
17 func simpleStart(t *parser.Tokeniser) (parser.Token, parser.TokenFunc) {
18 return t.Return(tokenStart, simpleString)
19 }
20
21 func simpleString(t *parser.Tokeniser) (parser.Token, parser.TokenFunc) {
22 if t.Next() == -1 {
23 return t.Return(tokenEnd, (*parser.Tokeniser).Done)
24 }
25
26 return t.Return(tokenChar, simpleString)
27 }
28
29 func partialStringStart(t *parser.Tokeniser) (parser.Token, parser.TokenFunc) {
30 return t.Return(tokenStart, partialString)
31 }
32
33 func partialString(t *parser.Tokeniser) (parser.Token, parser.TokenFunc) {
34 switch t.Peek() {
35 case -1:
36 return t.Return(tokenEnd, (*parser.Tokeniser).Done)
37 case '*':
38 return t.Return(tokenAnyChar, partialStringWildcard)
39 case '\\':
40 t.Next()
41 t.Get()
42
43 if t.Peek() == -1 {
44 return t.ReturnError(ErrInvalidEscape)
45 }
46 }
47
48 t.Next()
49
50 return t.Return(tokenChar, partialString)
51 }
52
53 func partialStringWildcard(t *parser.Tokeniser) (parser.Token, parser.TokenFunc) {
54 t.Next()
55
56 return t.Return(tokenRepeat, partialString)
57 }
58
59 var ErrInvalidEscape = errors.New("invalid escape sequence")
60