This is the proposed pattern grammar.

Asterisks mark rules that have changed.

pat ::= 
        identifier                      anything, can not be ooo
      | _                               anything
      | #t                              #t
      | #f                              #f
      | string                          a string
      | number                          a number
      | character                       a character
      | 'sexp                           an s-expression
      | 'symbol                         a symbol (special case of s-expr)
*     | (list lvp_1 ... lvp_n)               list of n elements
*     | (list-rest lvp_1 ... lvp_n lvp_{n+1})   list of n or more
*     | (vector lvp_1 ... lvp_n)              vector of n elements
*     | (box pat)                           box
*     | (struct struct-name (pat_1 ... pat_n)) a structure
      ;; this may be better as '$' ?     
      | (list-no-order pat ...)         matches a list with no regard for 
                                        the order of the
                                        items in the list
      | (list-no-order pat ... pat_n ooo) pat_n matches the remaining 
                                          unmatched items
      | (hash-table pat ...)            matches the elements of a hash table
      | (hash-table pat ... pat_n ooo)  pat_n must match the remaining 
                                        unmatched elements
*     | (app field pat)                   a field of a structure (field is 
                                          an accessor)
                                        Actually field can be any function 
                                        which can be
                                        applied to the data being matched.
                                        Ex: (match 5 ((= add1 b) b)) => 6

      | (and pat_1 ... pat_n)           if all of pat_1 thru pat_n match
      | (or pat_1 ... pat_n)            if any of pat_1 thru pat_n match
      | (not pat_1 ... pat_n)           if all pat_1 thru pat_n don't match
*     | (? predicate pat_1 ... pat_n)   if predicate is true and all of
                                         pat_1 thru pat_n match
      | (set! identifier)               anything, and binds setter
      | (get! identifier)               anything, and binds getter
      | `qp                             a quasi-pattern

lvp ::= pat ooo                         greedily matches n or more of pat, 
                                        each element must match pat
      | pat                             matches pat

ooo ::= ...                             zero or more
      | ___                             zero or more
      | ..k                             k or more
      | __k                             k or more

        quasi-patterns:                 matches:

qp  ::= ()                              the empty list
      | #t                              #t
      | #f                              #f
      | string                          a string
      | number                          a number
      | character                       a character
      | identifier                      a symbol
      | (qp_1 ... qp_n)                 list of n elements
      | (qp_1 ... qp_n . qp_{n+1})      list of n or more
      | (qp_1 ... qp_n qp_n+1 ooo)      list of n or more, each element
                                          of remainder must match qp_n+1
      | #(qp_1 ... qp_n)                vector of n elements
      | #(qp_1 ... qp_n qp_n+1 ooo)     vector of n or more, each element
                                          of remainder must match qp_n+1
      | #&qp                            box
      | ,pat                            a pattern
      | ,@(lvp . . . lvp-n)
      | ,@(lvp-1 . . . lvp-n . lvp-{n+1})
      | ,@`qp                           qp must evaluate to a list as 
                                        so that this rule resembles the 
                                        above two rules
