;; let's try to build these data structures for the parser: ;; stack = (:elem item state stack) | (:nil) ;; item = (:nt kind args) | (:t val) ;; args = (:cons item args) | (:nil) ;; state = int ;; kind = symbol (datatype list (:cons 'a (list 'a)) (:nil) ) (datatype item (:nt string (list (item 'a))) (:t string) ) (datatype stack (:empty) (:elem (item 'a) int (stack 'a)) ) (let ((stack (stack:empty)) (item0 (item:t "terminal")) (item1 (item:nt "non-terminal" (list:cons (item:t "term2") (list:nil)))) ) (define (push x y) (set! stack (stack:elem x y stack)) stack ) (push item0 34) (push item1 9) ;;(push item0 #t) stack )