anchor.diff:           (no-parse ()
              ,no-parse-form)))))
   
  +(define-condition abort-parse (error)
  +  ((message
  +    :initarg :message
  +    :type string
  +    :initform "<No reason>"
  +    :accessor parse-error-message))
  +  (:report (lambda (c s) (format s "Parse error (~A)" (parse-error-message c)))))
  +
  +(defmacro abort-parse (message &rest expected-tokens)
  +  (declare (ignore expected-tokens))
  +  `(signal 'parse-error :message ,message))
  +
   (defmacro define-recursive-descent-parser (name &body body)
     (let (result-forms)
       (macrolet ((send (form) `(push ,form result-forms))
  
positive.code:          (keywordp (car form))))
  
    (defun grammar-lookup-option (option-name options)
      (second (find option-name options :key #'car :test #'eq))))
  
  (defclass syntax-tree ()
    ((raw-matches
  
negative.code: 
            (unless (and start-symbol terminals)
              (error "Start symbol and terminals are required"))
  
            (when (left-recursion-p nonterminals)
              (error "Grammar has left recursion ~A" (left-recursion-p nonterminals)))
  
            ;; Easiest stuff first.  The root node
            (send `(defmethod parse-recursive ((type (eql ',name)) (iter lookahead-iterator))
  