-
Notifications
You must be signed in to change notification settings - Fork 0
/
token.go
134 lines (112 loc) · 1.76 KB
/
token.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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
package toaster
import (
"strings"
)
// Kind ...
type Kind int
// Token ...
type Token struct {
Literal string
Kind Kind
}
// tokens
const (
ILLEGAL Kind = iota
EOF
WS
COMMENT
// Literals
IDENT
NUMBER // 12345.67
STRING // "abc"
BADSTRING // "abc
BADESCAPE // \q
//boolean literals
TRUE
FALSE
// Operators
ASSIGN
// Delimiters
ASTERISK
COMMA
SEMICOLON
LPAREN
RPAREN
keywordBeg
//keywords
AS
BOOL
CREATE
DELETE
FROM
INSERT
INT
INTO
SELECT
SET
TABLE
TEXT
UPDATE
WHERE
VALUES
keywordEnd
)
var tokens = [...]string{
ILLEGAL: "ILLEGAL",
EOF: "EOF",
WS: "WS",
IDENT: "IDENT",
NUMBER: "NUMBER",
STRING: "STRING",
BADSTRING: "BADSTRING",
BADESCAPE: "BADESCAPE",
TRUE: "true",
FALSE: "false",
ASSIGN: "=",
ASTERISK: "*",
COMMA: ",",
SEMICOLON: ";",
LPAREN: "(",
RPAREN: ")",
AS: "as",
BOOL: "bool",
CREATE: "create",
DELETE: "delete",
FROM: "from",
INSERT: "insert",
INT: "int",
INTO: "into",
SELECT: "select",
SET: "set",
TABLE: "table",
TEXT: "text",
UPDATE: "update",
VALUES: "values",
WHERE: "where",
}
var keywords map[string]Kind
func init() {
keywords = make(map[string]Kind)
for tok := keywordBeg + 1; tok < keywordEnd; tok++ {
keywords[strings.ToLower(tokens[tok])] = tok
}
keywords["true"] = TRUE
keywords["false"] = FALSE
}
// String returns the string representation of the token.
func (tok Token) String() string {
if tok.Kind >= 0 && tok.Kind < Kind(len(tokens)) {
return tokens[tok.Kind]
}
return ""
}
// LookupIdent ...
func LookupIdent(ident string) Kind {
if tok, ok := keywords[strings.ToLower(ident)]; ok {
return tok
}
return IDENT
}
func newToken(kind Kind, lit string) Token {
return Token{Kind: kind, Literal: lit}
}