4
4
"errors"
5
5
"fmt"
6
6
"strings"
7
- "unicode"
8
7
)
9
8
10
9
type token struct {
@@ -14,14 +13,6 @@ type token struct {
14
13
15
14
type charPredicate func (byte ) bool
16
15
17
- type scanner interface {
18
- scan (string ) (token , string , error )
19
- }
20
-
21
- type scannerFunc func (string ) (token , string , error )
22
-
23
- func (sf scannerFunc ) scan (code string ) (token , string , error ) { return sf (code ) }
24
-
25
16
type eskipLex struct {
26
17
code string
27
18
lastToken string
@@ -78,11 +69,11 @@ func (l *eskipLex) init(code string) {
78
69
79
70
func isNewline (c byte ) bool { return c == newlineChar }
80
71
func isUnderscore (c byte ) bool { return c == underscore }
81
- func isAlpha (c byte ) bool { return unicode . IsLetter ( rune ( c ) ) }
82
- func isDigit (c byte ) bool { return unicode . IsDigit ( rune ( c )) }
83
- func isSymbolChar (c byte ) bool { return isUnderscore (c ) || isAlpha (c ) || isDigit (c ) }
72
+ func isAlpha (c byte ) bool { return ( c >= 'a' && c <= 'z' ) || ( c >= 'A' && c <= 'Z' ) }
73
+ func isDigit (c byte ) bool { return c >= '0' && c <= '9' }
74
+ func isSymbolChar (c byte ) bool { return isAlpha (c ) || isDigit (c ) || isUnderscore (c ) }
84
75
func isDecimalChar (c byte ) bool { return c == decimalChar }
85
- func isNumberChar (c byte ) bool { return isDecimalChar (c ) || isDigit (c ) }
76
+ func isNumberChar (c byte ) bool { return isDigit (c ) || isDecimalChar (c ) }
86
77
87
78
func scanWhile (code string , p charPredicate ) (string , string ) {
88
79
for i := 0 ; i < len (code ); i ++ {
@@ -277,74 +268,78 @@ func scanNumber(code string) (t token, rest string, err error) {
277
268
278
269
func scanSymbol (code string ) (t token , rest string , err error ) {
279
270
t .id = symbol
280
- t .val , rest = scanWhile (code , isSymbolChar )
271
+ for i := 0 ; i < len (code ); i ++ {
272
+ if ! isSymbolChar (code [i ]) {
273
+ t .val , rest = code [0 :i ], code [i :]
274
+ return
275
+ }
276
+ }
277
+ t .val , rest = code , ""
281
278
return
282
279
}
283
280
284
- func selectScanner (code string ) scanner {
281
+ func scan (code string ) ( token , string , error ) {
285
282
switch code [0 ] {
286
283
case ',' :
287
- return commaToken
284
+ return commaToken . scan ( code )
288
285
case ')' :
289
- return closeparenToken
286
+ return closeparenToken . scan ( code )
290
287
case '(' :
291
- return openparenToken
288
+ return openparenToken . scan ( code )
292
289
case ':' :
293
- return colonToken
290
+ return colonToken . scan ( code )
294
291
case ';' :
295
- return semicolonToken
292
+ return semicolonToken . scan ( code )
296
293
case '>' :
297
- return closearrowToken
294
+ return closearrowToken . scan ( code )
298
295
case '*' :
299
- return anyToken
296
+ return anyToken . scan ( code )
300
297
case '&' :
301
298
if len (code ) >= 2 && code [1 ] == '&' {
302
- return andToken
299
+ return andToken . scan ( code )
303
300
}
304
301
case '-' :
305
302
if len (code ) >= 2 && code [1 ] == '>' {
306
- return arrowToken
303
+ return arrowToken . scan ( code )
307
304
}
308
305
case '/' :
309
- return scannerFunc ( scanRegexpOrComment )
306
+ return scanRegexpOrComment ( code )
310
307
case '"' :
311
- return scannerFunc ( scanDoubleQuote )
308
+ return scanDoubleQuote ( code )
312
309
case '`' :
313
- return scannerFunc ( scanBacktick )
310
+ return scanBacktick ( code )
314
311
case '<' :
315
312
for _ , tok := range openarrowPrefixedTokens {
316
313
if strings .HasPrefix (code , tok .val ) {
317
- return tok
314
+ return tok . scan ( code )
318
315
}
319
316
}
320
- return openarrowToken
317
+ return openarrowToken . scan ( code )
321
318
}
322
319
323
320
if isNumberChar (code [0 ]) {
324
- return scannerFunc ( scanNumber )
321
+ return scanNumber ( code )
325
322
}
326
323
327
324
if isAlpha (code [0 ]) || isUnderscore (code [0 ]) {
328
- return scannerFunc ( scanSymbol )
325
+ return scanSymbol ( code )
329
326
}
330
327
331
- return nil
328
+ return token {}, "" , unexpectedToken
332
329
}
333
330
334
- func (l * eskipLex ) next () (t token , err error ) {
331
+ func (l * eskipLex ) next () (token , error ) {
335
332
l .code = scanWhitespace (l .code )
336
333
if len (l .code ) == 0 {
337
- err = eof
338
- return
334
+ return token {}, eof
339
335
}
340
336
341
- s := selectScanner (l .code )
342
- if s == nil {
343
- err = unexpectedToken
344
- return
337
+ t , rest , err := scan (l .code )
338
+ if err == unexpectedToken {
339
+ return token {}, err
345
340
}
341
+ l .code = rest
346
342
347
- t , l .code , err = s .scan (l .code )
348
343
if err == void {
349
344
return l .next ()
350
345
}
@@ -353,7 +348,7 @@ func (l *eskipLex) next() (t token, err error) {
353
348
l .lastToken = t .val
354
349
}
355
350
356
- return
351
+ return t , err
357
352
}
358
353
359
354
func (l * eskipLex ) Lex (lval * eskipSymType ) int {
0 commit comments