anchor.diff:  ;;; fact : simple { ^ fact }
   ;;; simple : ident | number | ( expr ) .
   
  +(declaim (ftype (function (t) t)
  +                parse-fact
  +                parse-term
  +                parse-expr
  +                parse-comp
  +                parse-conj
  +                parse-disj))
  +
   (defun parse-simp (simp)
     "
   DO:         Parses a simple expression:
  
positive.code: 
  (defun input-data (type)
    (cond
     ((eq type 'string) (protect-break (read-line)))
     ((eq type 'number) (protect-break (read)))))
  
  
  
  
negative.code: RETURN:     A parse tree or :ERROR ; a cdr of simp.
  "
    (cond
      ((member (car simp) '(+ -))
       (multiple-value-bind (expr rest) (parse-simp (cdr simp))
         (if (eq :error expr)
             (values expr rest)
             (if (eq (car simp) '+)
                 (values expr rest)
                 (values (list 'neg expr) rest)))))
      ((numberp (car simp)) (values (car simp) (cdr simp)))
      ((stringp (car simp)) (values (car simp) (cdr simp)))
      ((symbolp (car simp)) (values (car simp) (cdr simp)))
      ((eq '|(| (car simp))
       (multiple-value-bind (expr rest) (parse-expr (cdr simp))
         (if (eq '|)| (car rest))
             (values expr (cdr rest))
             (progn
               (berror "MISSING A CLOSING PARENTHESE.")
               (values :error nil)))))
      (t (berror "INVALID TOKEN IN EXPRESSION ~S." (car simp)))))
  
  
  
  