anchor.diff:              (values end value)
               (grammar-or ,@rest)))))
   
  +
  +(defmacro grammar-n* (n x)
  +  (cond
  +    ((null x) nil)
  +    ((symbolp x) `(match-n ,n ',x string :start start))
  +    ((listp x)
  +     (let ((f (gensym)))
  +       `(let ((,f (lambda (string &key (start 0))
  +                   ,x)))
  +         (match-n ,n ,f string :start start))))
  +    (t (error (format nil "grammar-n* cannot process ~S" x)))))
   
   (defmacro grammar-* (x)
     (cond
  
positive.code:    (grammar-string "(")
     (grammar-* parse-token)
     (grammar-string ")")))
  
  ;; Example from ISO EBNF spec, section 5.8
  (defun letter (string &key (start 0))
  
negative.code: 
  ;; return a list of the children
  ;; return the end of the last child
  (defun match-n (n f string &key (start 0))
    (if (> n 0)
        (multiple-value-bind (end value) (funcall f string :start start)
          (when end
            (multiple-value-bind (e v) (match-n (1- n) f string :start end)
              (when e
                (if (car v)
                    (values e (cons value v))
                    (values e (list value)))))))
        start))
  
  (defun kleene* (f string &key (start 0))
    (multiple-value-bind (end value) (funcall f string :start start)
      (if end
          (multiple-value-bind (e v) (kleene* f string :start end)
            (values e (cons value v)))
          start)))
  
  (defun kleene+ (f string &key (start 0))
    "<rule>+ == <rule> <rule>*"
  