-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlexer.go
108 lines (103 loc) · 2.09 KB
/
lexer.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
package main
func isChar(word byte) bool {
if word >= 65 && word < 91 || word >= 97 && word <= 122 {
return true
}
return false
}
func isNumber(word byte) bool {
if word >= 48 && word < 58 {
return true
}
return false
}
func return_kind(word byte) kind {
if isChar(word) {
return Identifier
}
if isNumber(word) {
return Number
}
switch word {
case 42: // *
return Star
case 94: // ^
return Raise
case 126: // ~
return Tilde
case 62: // >
return Great
case 60: // <
return Less
case 61: // =
return Equal
case 124: // |
return Pipe
case 45: // -
return Hyphen
case 46: // .
return Dot
case 64: // @
return At
}
return Nil
}
func GetTokens(version string) []Token {
var tokens []Token
i := 0
for i < len(version) {
ver := version[i]
if ver != 32 { // 32 is ascii for blank
tkind := return_kind(ver)
if tkind == Number {
tokens = append(tokens, Token{
Value: string(ver),
Kind: tkind,
})
for i+1 < len(version) && (return_kind(version[i+1]) == Number || return_kind(version[i+1]) == Dot || version[i+1] == 'x') {
tokens[len(tokens)-1].Value += string(version[i+1])
i += 1
}
} else if tkind == Identifier {
tokens = append(tokens, Token{
Value: "",
Kind: tkind,
})
for tkind == Identifier || tkind == Number {
tokens[len(tokens)-1].Value += string(ver)
i += 1
if i < len(version) {
ver = version[i]
tkind = return_kind(ver)
} else {
break
}
}
i -= 1
} else if tkind == Equal {
if tokens[len(tokens)-1].Kind == Great {
tokens[len(tokens)-1].Value = ">="
tokens[len(tokens)-1].Kind = GreatEqual
} else if tokens[len(tokens)-1].Kind == Less {
tokens[len(tokens)-1].Value = "<="
tokens[len(tokens)-1].Kind = LessEqual
}
} else if tkind == Pipe {
if return_kind(version[i+1]) == Pipe {
tokens = append(tokens, Token{
Value: "||",
Kind: tkind,
})
i += 1
}
} else {
tokens = append(tokens, Token{
Value: string(ver),
Kind: tkind,
})
}
}
i += 1
}
return tokens
}