-
Notifications
You must be signed in to change notification settings - Fork 0
/
front-end.scm
28 lines (23 loc) · 1.05 KB
/
front-end.scm
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
(define (read-input char accum); accum = list of chars
(if (eq? char #\newline) accum; reversed, but un-reversed in make-tokens
(read-input (read-char) (cons char accum))))
(define (remove-spaces tokens)
(cond
((null? tokens) tokens)
((null? (car tokens)) (remove-spaces (cdr tokens)))
(else (cons (car tokens) (remove-spaces (cdr tokens))))))
(define (make-tokens chars tokens char-buffer)
(if (null? chars) (cons char-buffer tokens)
(let ((current-char (car chars)))
(if (eq? current-char #\space)
(make-tokens (cdr chars) (cons char-buffer tokens) '())
(make-tokens (cdr chars) tokens (cons current-char char-buffer))))))
(define (tokenize chars) (remove-spaces (make-tokens chars '() '())))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define (parse tokens)
(if (null? tokens) tokens
(let ((current-token (list->string (car tokens))))
(let ((possible-num (string->number current-token)))
(if possible-num
(cons possible-num (parse (cdr tokens)))
(cons current-token (parse (cdr tokens))))))))