;parser functions (define token-buffer '()) (define save-token (lambda (token) (set! token-buffer token))) (define get-next-token (lambda () (cond ((null? token-buffer) (next-token)) (else (let ((token token-buffer)) (begin (set! token-buffer '()) token)))))) (define init-parser (lambda () (begin (set! token-buffer '()) (init-scanner)))) ;scanner functions (define char-buffer '()) (define token-buffer '()) (define init-scanner (lambda () (set! char-buffer '()))) (define save-char (lambda (char) (set! char-buffer char))) (define next-char (lambda () (cond ((null? char-buffer) (display-and-return (read-char))) (else (let ((char char-buffer)) (begin (set! char-buffer '()) char)))))) (define display-and-return (lambda (char) (begin (display char) char))) (define space? (lambda (char) (or (eq? char #\space) (eq? char #\newline)))) (define letter? (lambda (char) (and (>= (char->integer char) (char->integer #\A)) (<= (char->integer char) (char->integer #\Z))))) (define digit? (lambda (char) (or (eq? char #\0) (eq? char #\1) (eq? char #\2) (eq? char #\3) (eq? char #\4) (eq? char #\5) (eq? char #\6) (eq? char #\7) (eq? char #\8) (eq? char #\9)))) (define symbol? (lambda (char) (or (eq? char #\~) (eq? char #\;) (eq? char #\+) (eq? char #\-) (eq? char #\*) (eq? char #\/) (eq? char #\&) (eq? char #\|) (eq? char #\>) (eq? char #\<) (eq? char #\=) (eq? char #\() (eq? char #\)) (eq? char #\.)))) (define char->num (lambda (char) (cond ((digit? char) (string->number (make-string 1 char))) (else (error "non-digit argument to char->num"))))) ;stack functions (define stack '()) (define init-stack (lambda () (set! stack '()))) (define push (lambda (number) (set! stack (cons number stack)))) (define pop (lambda () (let ((top (first stack))) (begin (set! stack (rest stack)) top)))) (define empty? (lambda () (null? stack))) (define one? (lambda () (cond ((null? stack) #f) (else (null? (rest stack)))))) ;evaluator functions (define bindings '()) (define init-evaluator (lambda () (begin (set! bindings '((#\A ()) (#\B ()) (#\C ()) (#\D ()) (#\E ()) (#\F ()) (#\G ()) (#\H ()) (#\I ()) (#\J ()) (#\K ()) (#\L ()) (#\M ()) (#\N ()) (#\O ()) (#\P ()) (#\Q ()) (#\R ()) (#\S ()) (#\T ()) (#\U ()) (#\V ()) (#\W ()) (#\X ()) (#\Y ()) (#\Z ()))) (init-parser))))