Operator Precedence Parser
(defun expr (inp) ; opprecc.lsp
(let (token *op-stack* *opnd-stack*)
(while inp
(setq token (pop inp))
(if (consp token) ; (exp)
(push (expr token) *opnd-stack*)
(if (operatorp token)
(progn
(while
(>= (prec (first *op-stack*))
(prec token))
(reducex))
(push token *op-stack*))
(push token *opnd-stack*))))
(while *op-stack* (reducex))
(pop *opnd-stack*) ))
; Reduce top of stacks to operand
(defun reducex ()
(let ((rhs (pop *opnd-stack*)))
(push (list (pop *op-stack*) ; op
(pop *opnd-stack*) ; lhs
rhs) ; rhs
*opnd-stack*) ))