|
|
|
@ -8,39 +8,12 @@
|
|
|
|
|
(lexer-src-pos
|
|
|
|
|
[(eof) eof]
|
|
|
|
|
[whitespace (token lexeme #:skip? #t)]
|
|
|
|
|
[(from/to "rem" "\n")
|
|
|
|
|
(token 'REM
|
|
|
|
|
(string-downcase lexeme)
|
|
|
|
|
#:position (pos lexeme-start)
|
|
|
|
|
#:line (line lexeme-start)
|
|
|
|
|
#:column (col lexeme-start)
|
|
|
|
|
#:span (- (pos lexeme-end)
|
|
|
|
|
(pos lexeme-start)))]
|
|
|
|
|
[(:or "print" "goto" "end")
|
|
|
|
|
(token (string-downcase lexeme)
|
|
|
|
|
(string-downcase lexeme)
|
|
|
|
|
#:position (pos lexeme-start)
|
|
|
|
|
#:line (line lexeme-start)
|
|
|
|
|
#:column (col lexeme-start)
|
|
|
|
|
#:span (- (pos lexeme-end)
|
|
|
|
|
(pos lexeme-start)))]
|
|
|
|
|
[(:+ numeric)
|
|
|
|
|
(token 'NUMBER
|
|
|
|
|
(string->number lexeme)
|
|
|
|
|
#:position (pos lexeme-start)
|
|
|
|
|
#:line (line lexeme-start)
|
|
|
|
|
#:column (col lexeme-start)
|
|
|
|
|
#:span (- (pos lexeme-end)
|
|
|
|
|
(pos lexeme-start)))]
|
|
|
|
|
[(from/to "\"" "\"")
|
|
|
|
|
(token 'STRING
|
|
|
|
|
(trim-ends "\"" lexeme "\"")
|
|
|
|
|
#:position (pos lexeme-start)
|
|
|
|
|
#:line (line lexeme-start)
|
|
|
|
|
#:column (col lexeme-start)
|
|
|
|
|
#:span (- (pos lexeme-end)
|
|
|
|
|
(pos lexeme-start)))]))
|
|
|
|
|
[(from/to "rem" "\n") (token 'REM (string-downcase lexeme))]
|
|
|
|
|
[(:or "print" "goto" "end") (token (string-downcase lexeme)
|
|
|
|
|
(string-downcase lexeme))]
|
|
|
|
|
[(:+ numeric) (token 'NUMBER (string->number lexeme))]
|
|
|
|
|
[(from/to "\"" "\"") (token 'STRING (trim-ends "\"" lexeme "\""))]))
|
|
|
|
|
|
|
|
|
|
(define (tokenize ip)
|
|
|
|
|
(port-count-lines! ip)
|
|
|
|
|
(thunk (basic-lexer ip)))
|
|
|
|
|
(λ () (basic-lexer ip)))
|