tokenizer.scm 696 B

1234567891011121314151617181920212223
  1. (define start-state 1)
  2. (define (tokenize p)
  3. (let loop ((state start-state)
  4. (collect (make-collector))
  5. (i 0)
  6. (l 0)
  7. (t '()))
  8. (cond
  9. ((equal? (peek-char p) #\tab)
  10. (error 'tokenize "tab character"))
  11. ((eof-object? (peek-char p))
  12. (collector-get collect))
  13. ((token state (peek-char p)) =>
  14. (lambda (state)
  15. (loop state collect i (+ l 1) (cons (read-char p) t))))
  16. ((accepting? state) =>
  17. (lambda (emitter)
  18. (let ((tok (emitter i l (list->string (reverse t)))))
  19. (when tok (collect-object! collect tok))
  20. (loop start-state collect (+ i l) 0 '()))))
  21. (else (error 'tokenize "no parsable token")))))