-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtokenizer.go
88 lines (79 loc) · 1.47 KB
/
tokenizer.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
package boolang
import "io"
type Tokenizer struct {
program string
index int
}
func NewTokenizer(program string) *Tokenizer {
return &Tokenizer{
program: program,
index: 0,
}
}
func (t *Tokenizer) Tokenize() []string {
tokens := []string{}
for token, err := t.next(); err == nil; token, err = t.next() {
if token == " " {
continue
}
tokens = append(tokens, token)
}
return tokens
}
func (t *Tokenizer) next() (string, error) {
token := ""
lastchar := ""
for t.peek() != "" {
char := t.get()
if char == "(" || char == ")" {
if token == "" {
return char, nil
}
t.back(1)
return token, nil
} else if char == "&" {
if lastchar == "&" && token != "&" {
t.back(2)
return token[:len(token)-1], nil
} else if lastchar == "&" {
return "&&", nil
}
} else if char == "|" {
if lastchar == "|" && token != "|" {
t.back(2)
return token[:len(token)-1], nil
} else if lastchar == "|" {
return "||", nil
}
} else if char == "!" {
if token == "" {
return "!", nil
}
t.back(1)
return token, nil
}
token += char
lastchar = char
}
if token == "" {
return "", io.EOF
}
return token, nil
}
func (t *Tokenizer) peek() string {
if t.index >= len(t.program) {
return ""
}
return string(t.program[t.index])
}
func (t *Tokenizer) get() string {
if t.index >= len(t.program) {
return ""
}
ch := t.program[t.index]
t.index++
return string(ch)
}
func (t *Tokenizer) back(n int) {
t.index -= n
}