;; 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
)