1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package token
18
19 import "strconv"
20
21
22 type Token int
23
24
25 const (
26
27 ILLEGAL Token = iota
28 EOF
29 COMMENT
30 ATTRIBUTE
31
32 literalBeg
33
34
35 IDENT
36 INT
37 FLOAT
38
39 STRING
40 INTERPOLATION
41 BOTTOM
42
43 literalEnd
44
45 operatorBeg
46
47 ADD
48 SUB
49 MUL
50 POW
51 QUO
52
53 IQUO
54 IREM
55 IDIV
56 IMOD
57
58 AND
59 OR
60
61 LAND
62 LOR
63
64 BIND
65 EQL
66 LSS
67 GTR
68 NOT
69 ARROW
70
71 NEQ
72 LEQ
73 GEQ
74
75 MAT
76 NMAT
77
78 LPAREN
79 LBRACK
80 LBRACE
81 COMMA
82 PERIOD
83 ELLIPSIS
84
85 RPAREN
86 RBRACK
87 RBRACE
88 SEMICOLON
89 COLON
90 OPTION
91 operatorEnd
92
93 keywordBeg
94
95 IF
96 FOR
97 IN
98 LET
99 FUNC
100
101 TRUE
102 FALSE
103 NULL
104
105 keywordEnd
106 )
107
108 var tokens = [...]string{
109 ILLEGAL: "ILLEGAL",
110
111 EOF: "EOF",
112 COMMENT: "COMMENT",
113
114 IDENT: "IDENT",
115 INT: "INT",
116 FLOAT: "FLOAT",
117 STRING: "STRING",
118 INTERPOLATION: "INTERPOLATION",
119 ATTRIBUTE: "ATTRIBUTE",
120
121 ADD: "+",
122 SUB: "-",
123 MUL: "*",
124 POW: "^",
125 QUO: "/",
126
127 IQUO: "quo",
128 IREM: "rem",
129 IDIV: "div",
130 IMOD: "mod",
131
132 AND: "&",
133 OR: "|",
134
135 LAND: "&&",
136 LOR: "||",
137
138 BIND: "=",
139 EQL: "==",
140 LSS: "<",
141 GTR: ">",
142 NOT: "!",
143 ARROW: "<-",
144
145 NEQ: "!=",
146 LEQ: "<=",
147 GEQ: ">=",
148
149 MAT: "=~",
150 NMAT: "!~",
151
152 LPAREN: "(",
153 LBRACK: "[",
154 LBRACE: "{",
155 COMMA: ",",
156 PERIOD: ".",
157 ELLIPSIS: "...",
158
159 RPAREN: ")",
160 RBRACK: "]",
161 RBRACE: "}",
162 SEMICOLON: ";",
163 COLON: ":",
164 OPTION: "?",
165
166 BOTTOM: "_|_",
167
168 FALSE: "false",
169 TRUE: "true",
170 NULL: "null",
171
172 FOR: "for",
173 IF: "if",
174 IN: "in",
175 LET: "let",
176 FUNC: "func",
177 }
178
179
180
181
182
183
184 func (tok Token) String() string {
185 s := ""
186 if 0 <= tok && tok < Token(len(tokens)) {
187 s = tokens[tok]
188 }
189 if s == "" {
190 s = "token(" + strconv.Itoa(int(tok)) + ")"
191 }
192 return s
193 }
194
195
196
197
198
199
200 const (
201 LowestPrec = lowestPrec
202 UnaryPrec = unaryPrec
203 HighestPrec = highestPrec
204 )
205
206 const (
207 lowestPrec = 0
208 unaryPrec = 8
209 highestPrec = 9
210 )
211
212
213
214
215 func (tok Token) Precedence() int {
216 switch tok {
217 case OR:
218 return 1
219 case AND:
220 return 2
221 case LOR:
222 return 3
223 case LAND:
224 return 4
225 case EQL, NEQ, LSS, LEQ, GTR, GEQ, MAT, NMAT:
226 return 5
227 case ADD, SUB:
228 return 6
229 case MUL, QUO, IDIV, IMOD, IQUO, IREM:
230 return 7
231 }
232 return lowestPrec
233 }
234
235 var keywords map[string]Token
236
237 func init() {
238 keywords = make(map[string]Token)
239 for i := keywordBeg + 1; i < keywordEnd; i++ {
240 keywords[tokens[i]] = i
241 }
242 }
243
244
245 func Lookup(ident string) Token {
246 if tok, isKeyword := keywords[ident]; isKeyword {
247 return tok
248 }
249 return IDENT
250 }
251
252
253
254
255
256 func (tok Token) IsLiteral() bool { return literalBeg < tok && tok < literalEnd }
257
258
259
260 func (tok Token) IsOperator() bool { return operatorBeg < tok && tok < operatorEnd }
261
262
263
264 func (tok Token) IsKeyword() bool { return keywordBeg < tok && tok < keywordEnd }
265
View as plain text