diff lisp/nxml/xsd-regexp.el @ 86361:38f93f3d00a2

Initial merge of nxml
author Mark A. Hershberger <mah@everybody.org>
date Fri, 23 Nov 2007 06:58:00 +0000
parents
children 2ac1a9b70580
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lisp/nxml/xsd-regexp.el	Fri Nov 23 06:58:00 2007 +0000
@@ -0,0 +1,2121 @@
+;;; xsd-regexp.el --- translate W3C XML Schema regexps to Emacs regexps
+
+;; Copyright (C) 2003 Free Software Foundation, Inc.
+
+;; Author: James Clark
+;; Keywords: XML, regexp
+
+;; This program is free software; you can redistribute it and/or
+;; modify it under the terms of the GNU General Public License as
+;; published by the Free Software Foundation; either version 2 of
+;; the License, or (at your option) any later version.
+
+;; This program is distributed in the hope that it will be
+;; useful, but WITHOUT ANY WARRANTY; without even the implied
+;; warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+;; PURPOSE.  See the GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public
+;; License along with this program; if not, write to the Free
+;; Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+;; MA 02111-1307 USA
+
+;;; Commentary:
+
+;; This handles the regular expressions in the syntax defined by:
+;; W3C XML Schema Part 2: Datatypes
+;; <http://www.w3.org/TR/xmlschema-2/#regexs>
+;;
+;; The main entry point is `xsdre-translate'.
+;;
+;; The features of XSD regexps that make this non-trivial are:
+;;
+;; - \p{PROP} escape for matching characters that have various
+;;   Unicode-defined properties
+;; - character class subtraction:, e.g. [\p{L}-[abc]] matches
+;;   any character in the L category other than a, b and c.
+;;
+;; We compute the set of Unicode characters denoted by each XSD
+;; char-class as a list of ranges.  The regexp generated for a
+;; single escape can be large (several thousand characters).
+;;
+;; XSD has non-traditional rules about when characters must be
+;; and can be quoted with \.  These are quite different from
+;; the Emacs rules.
+;;
+;; The semantics of XSD regexps are defined in terms of Unicode.
+;; Non-Unicode characters are not allowed in regular expressions and
+;; will not match against the generated regular expressions.  A
+;; Unicode character means a character in one of the Mule charsets
+;; ascii, latin-iso8859-1, mule-unicode-0100-24ff,
+;; mule-unicode-2500-33ff, mule-unicode-e000-ffff, eight-bit-control
+;; or a character translateable to such a character (i.e a character
+;; for which `encode-char' will return non-nil).
+;;
+;; Using unify-8859-on-decoding-mode is probably a good idea here
+;; (and generally with XML and other Unicode-oriented formats).
+;;
+;; Unfortunately, this means that this package is currently useless
+;; for CJK characters, since there's no mule-unicode charset for the
+;; CJK ranges of Unicode.  We should devise a workaround for this
+;; until the fabled Unicode version of Emacs makes an appearance.
+
+;;; Code:
+
+(defun xsdre-translate (regexp)
+  "Translate a W3C XML Schema Datatypes regexp to an Emacs regexp.
+Returns a string.  REGEXP is a string. If REGEXP is not a valid XSD
+regexp, signal an `xsdre-invalid-regexp' condition."
+  (xsdre-from-symbolic
+   (xsdre-to-symbolic regexp)))
+
+(defvar xsdre-test-history nil)
+
+(defun xsdre-test-regexp ()
+  (interactive)
+  (while
+      (let* ((str (read-from-minibuffer "Regexp: "
+					nil
+					nil
+					nil
+					'xsdre-test-history))
+	     (symbolic
+	      (xsdre-to-symbolic str)))
+	(with-output-to-temp-buffer "*XSD Regexp Test*"
+	  (princ "XSD regexp: ")
+	  (princ str)
+	  (princ "\n")
+	  (princ "Symbolic: ")
+	  (princ "\n")
+	  (pp symbolic)
+	  (princ "\n")
+	  (princ "Emacs regexp: ")
+	  (princ (xsdre-from-symbolic symbolic)))
+	t)))
+
+;;; Range lists
+
+(defsubst xsdre-make-range (first last)
+  "Return a representation of a range of integers.
+If the range contains a single integer, it is represented by that integer.
+Otherwise, it is represented by a (FIRST . LAST) pair."
+  (if (= first last)
+      first
+    (cons first last)))
+
+(defsubst xsdre-range-first (r)
+  "Return the first integer in a range."
+  (if (consp r) (car r) r))
+
+(defsubst xsdre-range-last (r)
+  "Return the last integer in a range."
+  (if (consp r) (cdr r) r))
+
+(defun xsdre-make-range-list (list)
+  "Make a range-list from a list of ranges.
+A range-list represents a set of integers by a list of ranges in a
+canonical form, in which ranges are in increasing order, and adjacent
+ranges are merged wherever possible."
+  (when list
+    (setq list 
+	  (sort list 'xsdre-range-less-than))
+    (let* ((next (cdr list))
+	   (tail list)
+	   (head (car list))
+	   (first (xsdre-range-first head))
+	   (last (xsdre-range-last head)))
+      (while next
+	(setq head (car next))
+	(when (> (xsdre-range-last head) last)
+	  (if (<= (xsdre-range-first head) (1+ last))
+	      (setq last (xsdre-range-last head))
+	    (setcar tail (xsdre-make-range first last))
+	    (setcdr tail next)
+	    (setq tail next)
+	    (setq first (xsdre-range-first head))
+	    (setq last (xsdre-range-last head))))
+	(setq next (cdr next)))
+      (setcar tail (xsdre-make-range first last))
+      (setcdr tail nil)
+      list)))
+    
+
+(defun xsdre-range-list-union (range-lists)
+  "Return a range-list the union of a list of range-lists."
+  (xsdre-make-range-list (apply 'append range-lists)))
+
+(defun xsdre-range-list-difference (orig subtract)
+  "Return a range-list for the difference of two range-lists."
+  (when orig
+    (let (new head next first last)
+      (while orig
+	(setq head (car orig))
+	(setq first (xsdre-range-first head))
+	(setq last (xsdre-range-last head))
+	(while (and subtract
+		    (< (xsdre-range-last (car subtract)) first))
+	  (setq subtract (cdr subtract)))
+	(while (and subtract
+		    (<= first last)
+		    (<= (xsdre-range-first (car subtract)) last))
+	  (when (< first (xsdre-range-first (car subtract)))
+	    (setq new
+		  (cons (xsdre-make-range 
+			 first
+			 (1- (xsdre-range-first (car subtract))))
+			new)))
+	  (if (< (xsdre-range-last (car subtract)) last)
+	      (progn
+		(setq first (1+ (xsdre-range-last (car subtract))))
+		(setq subtract (cdr subtract)))
+	    (setq first (1+ last))))
+	(when (<= first last)
+	  (setq new (cons (xsdre-make-range first last) new)))
+	(setq orig (cdr orig)))
+      (nreverse new))))
+
+(defun xsdre-range-less-than (r1 r2)
+  "Return non-nil if range R1 is less than range R2."
+  (or (< (xsdre-range-first r1) (xsdre-range-first r2))
+      (and (= (xsdre-range-first r1) (xsdre-range-first r2))
+	   (< (xsdre-range-last r1) (xsdre-range-last r2)))))
+
+(defun xsdre-check-range-list (range-list)
+  "Check that range-list is a range-list.
+Signal an error if it is not."
+  (let ((last nil))
+    (while range-list
+      (unless (consp range-list)
+	(error "Range list not a list"))
+      (let ((head (car range-list)))
+	(unless (or (integerp head)
+		    (and (consp head)
+			 (integerp (car head))
+			 (integerp (cdr head))))
+	  (error "Bad range %s" head))
+	(when (and last
+		   (not (< (1+ last) (xsdre-range-first head))))
+	  (error "Ranges not strictly increasing"))
+	(setq last (xsdre-range-last head)))
+      (setq range-list (cdr range-list))))
+  t)
+	
+;;; Compiling symbolic regexps to Emacs regexps
+
+(defun xsdre-from-symbolic (re)
+  "Return an Emacs regexp for the symbolic regexp RE."
+  (apply 'concat
+	 (nreverse (xsdre-compile-regexp re nil))))
+
+(defun xsdre-compile-regexp (re accum)
+  "Return a Emacs regular expression for the symbolic regexp RE.
+Returns a list of strings whose head is the regexp for RE
+and whose tail is ACCUM."
+  (cond ((not (consp re))
+	 (xsdre-compile-char-class re accum))
+	((eq (car re) 'choice)
+	 (setq accum (cons "\\(?:" accum))
+	 (let ((choices (cdr re)))
+	   (while choices
+	     (setq accum
+		   (xsdre-compile-regexp (car choices)
+					 accum))
+	     (setq choices (cdr choices))
+	     (when choices
+	       (setq accum
+		     (cons "\\|" accum)))))
+	 (cons "\\)" accum))
+	((eq (car re) 'sequence)
+	 (let ((members (cdr re)))
+	   (while members
+	     (setq accum (xsdre-compile-regexp (car members)
+					       accum))
+	     (setq members (cdr members))))
+	 accum)
+	((eq (car re) 'repeat)
+	 (let* ((sub (nth 1 re))
+		(lower (nth 2 re))
+		(upper (nth 3 re))
+		(need-paren (and (consp sub)
+				 (eq (car sub) 'sequence))))
+	   (when need-paren
+	     (setq accum (cons "\\(?:" accum)))
+	   (setq accum
+		 (xsdre-compile-regexp sub accum))
+	   (when need-paren
+	     (setq accum (cons "\\)" accum)))
+	   (cond ((not upper)
+		  (cond ((eq lower 0)
+			 (cons "*" accum))
+			((eq lower 1)
+			 (cons "+" accum))
+			(t
+			 (cons (concat "\\{"
+				       (number-to-string lower)
+				       ",\\}")
+			       accum))))
+		 ((eq lower upper)
+		  (cons (concat "\\{"
+				(number-to-string lower)
+				"\\}")
+			accum))
+		 ((and (eq lower 0) (eq upper 1))
+		  (cons "?" accum))
+		 (t
+		  (cons (concat "\\{"
+				(number-to-string lower)
+				","
+				(number-to-string upper)
+				"\\}")
+			accum)))))
+	(t (xsdre-compile-char-class re accum))))
+
+(defun xsdre-compile-char-class (cc accum)
+  "Return a Emacs regular expression for the symbolic character class CC.
+Returns a list of strings whose head is the regexp for CC
+and whose tail is ACCUM."
+  (cons (if (integerp cc)
+	    (xsdre-compile-single-char cc)
+	  (let ((ranges (xsdre-range-list-mule-intersection
+			 (xsdre-char-class-to-range-list cc))))
+	    (cond ((null ranges) "\001-\000")
+		  ((and (null (cdr ranges))
+			(= (xsdre-range-first (car ranges))
+			   (xsdre-range-last (car ranges))))
+		   (xsdre-compile-single-char
+		    (xsdre-range-first (car ranges))))
+		  (t (xsdre-range-list-to-char-alternative ranges)))))
+	accum))
+	      
+(defun xsdre-compile-single-char (ch)
+  (if (memq ch '(?. ?* ?+ ?? ?\[ ?\] ?^ ?$ ?\\))
+      (string ?\\ ch)
+    (string (decode-char 'ucs ch))))
+  
+(defun xsdre-char-class-to-range-list (cc)
+  "Return a range-list for a symbolic char-class."
+  (cond ((integerp cc) (list cc))
+	((symbolp cc)
+	 (or (get cc 'xsdre-ranges)
+	     (xsdre-char-class-to-range-list (get cc 'xsdre-char-class))))
+	((integerp (car cc))
+	 (if (= (car cc) (cdr cc))
+	     (car cc)
+	   cc))
+	((eq (car cc) 'union)
+	 (xsdre-range-list-union (mapcar 'xsdre-char-class-to-range-list
+					 (cdr cc))))
+	((eq (car cc) 'difference)
+	 (xsdre-range-list-difference
+	  (xsdre-char-class-to-range-list (nth 1 cc))
+	  (xsdre-char-class-to-range-list (nth 2 cc))))
+	((eq (car cc) 'range)
+	 (list (xsdre-make-range (nth 1 cc) (nth 2 cc))))
+	(t (error "Internal error in XSD regexp compilation: \
+unknown char-class %s" cc))))
+
+(defconst xsdre-mule-char-set-ranges
+  '((0 . 127)
+    (128 . 159)
+    (160 . 255)
+    (#x0100 . #x24ff)
+    (#x2500 . #x33ff)
+    (#xe000 . #xffff))
+  "List of ranges for the Mule character sets containing Unicode characters.")
+
+(defun xsdre-range-list-mule-intersection (range-list)
+  "Return the intersection of RANGE-LIST with the mule-supported ranges.
+Also split ranges so that no range spans more that one mule charset."
+  (when range-list
+    (let* ((char-set-ranges (cdr xsdre-mule-char-set-ranges))
+	   (mule-ranges nil)
+	   (char-set-first (caar xsdre-mule-char-set-ranges))
+	   (char-set-last (cdar xsdre-mule-char-set-ranges))
+	   (range (car range-list))
+	   (first (xsdre-range-first range))
+	   (last (xsdre-range-last range)))
+      (setq range-list (cdr range-list))
+      (while (progn
+	       (cond ((> first last)
+		      (if (null range-list)
+			  nil
+			(setq range (car range-list))
+			(setq first (xsdre-range-first range))
+			(setq last (xsdre-range-last range))
+			(setq range-list (cdr range-list))
+			t))
+		     ((< char-set-last first)
+		      (if (null char-set-ranges)
+			  nil
+			(setq char-set-first (caar char-set-ranges))
+			(setq char-set-last (cdar char-set-ranges))
+			(setq char-set-ranges (cdr char-set-ranges))
+			t))
+		     ((< first char-set-first)
+		      (setq first char-set-first))
+		     ;; Now we know that
+		     ;; first <= last
+		     ;; first <= char-set-last
+		     ;; first >= char-set-first
+		     ((<= last char-set-last)
+		      (setq mule-ranges
+			    (cons (xsdre-make-range first last)
+				  mule-ranges))
+		      (setq first (1+ last))
+		      t)
+		     (t
+		      (setq mule-ranges
+			    (cons (xsdre-make-range first char-set-last)
+				  mule-ranges))
+		      (setq first (1+ char-set-last))
+		      t))))
+      (nreverse mule-ranges))))
+
+(defun xsdre-range-list-to-char-alternative (range-list)
+  "Return a char alternative for a range-list.
+RANGE-LIST must contain more than integer.
+The char alternative is a string containing an Emacs regexp
+consisting of a single char alternative delimited with []."
+  (let (range caret close-bracket hyphen chars first last)
+    (while range-list
+      (setq range (car range-list))
+      (setq first (xsdre-range-first range))
+      (setq last (xsdre-range-last range))
+      (while (and (cond ((eq first ?^)
+			 (setq caret t)
+			 (setq first (1+ first)))
+			((eq first ?-)
+			 (setq hyphen t)
+			 (setq first (1+ first)))
+			((eq first ?\])
+			 (setq close-bracket t)
+			 (setq first (1+ first))))
+		  (<= first last)))
+      (when (<= first last)
+	(setq chars
+	      (cons first chars))
+	(when (< first last)
+	  (setq chars
+		(if (and (eq last (1+ first))
+			 (not (eq last ?-)))
+		    (cons last chars)
+		  (cons last (cons ?- chars))))))
+      (setq range-list (cdr range-list)))
+    (setq chars
+	  (mapcar (lambda (c)
+		    (decode-char 'ucs c))
+		  chars))
+    (when caret
+      (setq chars (cons ?^ chars)))
+    (when hyphen
+      (setq chars (cons ?- chars)))
+    (setq chars (cons ?\] chars))
+    (setq chars (nreverse chars))
+    (when close-bracket
+      (setq chars (cons ?\] chars)))
+    (when (equal chars '(?^ ?- ?\]))
+      (setq chars '(?- ?^ ?\])))
+    (setq chars (cons ?\[ chars))
+    (apply 'string chars)))
+      
+;;; Parsing
+
+(defvar xsdre-current-regexp nil
+  "List of characters remaining to be parsed. Dynamically bound.")
+
+(defun xsdre-to-symbolic (str)
+  "Convert a W3C XML Schema datatypes regexp to a symbolic form.
+
+The symbolic form has the following structure:
+
+REGEXP ::=
+  (sequence REGEXP ...)
+  | (choice REGEXP ...)
+  | (repeat REGEXP MIN MAX)
+  | CHAR-CLASS
+
+CHAR-CLASS ::=
+  CHAR
+  | SYMBOLIC-CHAR-CLASS
+  | RANGE
+  | (union CHAR-CLASS ...)
+  | (difference CHAR-CLASS CHAR-CLASS)
+
+RANGE ::= (range LOWER UPPER)
+
+MIN ::= INTEGER
+MAX ::= INTEGER | nil
+CHAR ::= UNICODE
+LOWER ::= UNICODE
+UPPER ::= UNICODE
+SYMBOLIC-CHAR-CLASS ::= SYMBOL
+
+where UNICODE is a integer specifying a Unicode code-point and
+SYMBOLIC-CHAR-CLASS is a symbol which has either a `xsdre-char-class'
+property whose value is a CHAR-CLASS, or a `xsdre-ranges' property
+whose value is a range-list."
+  (let ((xsdre-current-regexp (string-to-list str)))
+    (condition-case err
+	(let ((symbolic (xsdre-parse-regexp)))
+	  (if xsdre-current-regexp
+	      (xsdre-parse-error "Unexpected %c" (car xsdre-current-regexp))
+	    symbolic))
+      (xsdre-parse-error
+       (signal 'xsdre-invalid-regexp
+	       (list (apply 'format (cdr err))
+		     (- (length str)
+			(length xsdre-current-regexp))))))))
+
+(put 'xsdre-invalid-regexp
+     'error-conditions
+     '(error xsdre-invalid-regexp))
+
+(put 'xsdre-invalid-regexp
+     'error-message
+     "Invalid W3C XML Schema Datatypes regular expression")
+
+(defun xsdre-parse-regexp ()
+  (let ((branches nil))
+    (while (progn
+	     (setq branches (cons (xsdre-parse-branch) branches))
+	     (when (eq (car xsdre-current-regexp) ?|)
+	       (xsdre-advance)
+	       t)))
+    (if (null (cdr branches))
+	(car branches)
+      (cons 'choice (nreverse branches)))))
+
+(defun xsdre-parse-branch ()
+  (let (items)
+    (while (let ((item (xsdre-try-parse-atom)))
+	     (when item
+	       (let ((quantifier (xsdre-try-parse-quantifier)))
+		 (when quantifier
+		   (setq item
+			 (list 'repeat
+			       item
+			       (car quantifier)
+			       (cdr quantifier)))))
+	       (setq items (cons item items)))))
+    (cond ((null items) '(sequence))
+	  ((null (cdr items)) (car items))
+	  (t (cons 'sequence (nreverse items))))))
+
+(defun xsdre-try-parse-quantifier ()
+  (let ((ch (car xsdre-current-regexp)))
+    (cond ((eq ch ?*) (xsdre-advance) '(0 . nil))
+	  ((eq ch ?+) (xsdre-advance) '(1 . nil))
+	  ((eq ch ??) (xsdre-advance) '(0 . 1))
+	  ((eq ch ?{)
+	   (xsdre-advance)
+	   (let ((lower (xsdre-parse-bound)))
+	     (setq ch (car xsdre-current-regexp))
+	     (cond ((eq ch ?})
+		    (xsdre-advance)
+		    (cons lower lower))
+		   ((eq ch ?,)
+		    (xsdre-advance)
+		    (cond ((eq (car xsdre-current-regexp) ?})
+			   (xsdre-advance)
+			   (cons lower nil))
+			  (t
+			   (let ((upper (xsdre-parse-bound)))
+			     (xsdre-expect ?})
+			     (cons lower upper)))))
+		   (t (xsdre-parse-error "Expected , or }")))))
+	  (t nil))))
+			
+(defun xsdre-parse-bound ()
+  (let ((n 0))
+    (while (progn
+	     (let* ((ch (car xsdre-current-regexp))
+		    (digit (memq ch '(?9 ?8 ?7 ?6 ?5 ?4 ?3 ?2 ?1 ?0))))
+	       (unless digit
+		 (xsdre-parse-error "Expected a digit"))
+	       (setq n (+ (* n 10)
+			  (length (cdr digit)))))
+	     (xsdre-advance)
+	     (not (memq (car xsdre-current-regexp) '(?} ?,)))))
+    n))
+	
+
+(defun xsdre-try-parse-atom ()
+  (let ((ch (car xsdre-current-regexp)))
+    (cond  ((memq ch '(nil ?? ?* ?+ ?\) ?\{ ?\} ?| ?\])) nil)
+	   ((eq ch ?\\)
+	    (xsdre-advance)
+	    (xsdre-parse-escape))
+	   ((eq ch ?\()
+	    (xsdre-advance)
+	    (let ((ret (xsdre-parse-regexp)))
+	      (xsdre-expect ?\))
+	      ret))
+	   ((eq ch ?\[)
+	    (xsdre-parse-char-class))
+	   ((eq ch ?.)
+	    (xsdre-advance)
+	    'dot)
+	   (t
+	    (let ((uc (encode-char ch 'ucs)))
+	      (unless uc
+		(xsdre-parse-error "%c is not a Unicode character" ch))
+	      (xsdre-advance) uc)))))
+
+(defun xsdre-parse-char-class ()
+  (xsdre-advance)
+  (let (compl members ret)
+    (when (eq (car xsdre-current-regexp) ?^)
+      (setq compl t)
+      (xsdre-advance))
+    (while (let ((member (xsdre-parse-char-class-member))
+		 uc1 uc2)
+	     (cond ((eq (car xsdre-current-regexp) ?\-)
+		    (xsdre-advance)
+		    (cond ((eq (car xsdre-current-regexp) ?\[)
+			   (setq members (cons member members))
+			   nil)
+			  ((not (integerp member))
+			   (xsdre-parse-error "Lower bound is not a single character"))
+			  ((not (setq uc1
+				      (encode-char member 'ucs)))
+			   (xsdre-parse-error "Lower bound %c is not a Unicode character"
+				  member))
+			  (t
+			   (let ((upper (xsdre-parse-char-class-member)))
+			     (unless (integerp upper)
+			       (xsdre-parse-error "Upper bound is not a single character"))
+			     (unless (setq uc2
+					   (encode-char upper 'ucs))
+			       (xsdre-parse-error "Upper bound %c is not a Unicode character" upper))
+			     (setq members
+				   (cons (list 'range uc1 uc2)
+					 members)))
+			   (not (eq (car xsdre-current-regexp) ?\])))))
+		   (t (setq members (cons member members))
+		      (not (eq (car xsdre-current-regexp) ?\]))))))
+    (setq members (nreverse members))
+    (if (null (cdr members))
+	(setq ret (car members))
+      (setq ret (cons 'union members)))
+    (when compl
+      (setq ret (list 'difference 'any ret)))
+    (when (eq (car xsdre-current-regexp) ?\[)
+      (setq ret
+	    (list 'difference ret (xsdre-parse-char-class))))
+    (xsdre-expect ?\])
+    ret))
+
+(defun xsdre-parse-char-class-member ()
+  (let ((ch (car xsdre-current-regexp)))
+    (cond ((null ch)
+	   (xsdre-parse-error "Expected ]"))
+	  ((eq ch ?\\)
+	   (xsdre-advance)
+	   (xsdre-parse-escape))
+	  ((memq ch '(?\[ ?\] ?-))
+	   (xsdre-parse-error "%c must be quoted in a character class" ch))
+	  (t (xsdre-advance) ch))))
+
+(defconst xsdre-single-escape
+  '((?s . space)
+    (?i . name-initial)
+    (?c . name-continue)
+    (?d . digit)
+    (?w . word)))
+
+(defun xsdre-parse-escape ()
+  (let ((ch (car xsdre-current-regexp)))
+    (xsdre-advance)
+    (cond ((memq ch '(?\\ ?| ?. ?- ?^ ?* ?+ ?( ?) ?{ ?} ?[ ?])) ch)
+	  ((eq ch ?r) ?\r)
+	  ((eq ch ?n) ?\n)
+	  ((eq ch ?t) ?\t)
+	  ((cdr (assq ch xsdre-single-escape)))
+	  ((let ((positive
+		  (cdr (assq (downcase ch) xsdre-single-escape))))
+	     (and positive
+		  (list 'difference 'any positive))))
+	  ((eq ch ?p) (xsdre-parse-prop))
+	  ((eq ch ?P) (list 'difference 'any (xsdre-parse-prop)))
+	  (t (if ch
+		 (xsdre-parse-error "Missing char after \\")
+	       (xsdre-parse-error "Bad escape %c" ch))))))
+	
+(defun xsdre-parse-prop ()
+  (xsdre-expect ?{)
+  (let ((name nil))
+    (while (not (eq (car xsdre-current-regexp) ?\}))
+      (unless xsdre-current-regexp
+	(xsdre-parse-error "Expected ?"))
+      (setq name (cons (car xsdre-current-regexp)
+		       name))
+      (xsdre-advance))
+    (xsdre-advance)
+    (setq name (nreverse name))
+    (cond ((null name) (xsdre-parse-error "Empty property name"))
+	  ((null (cdr name))
+	   (let ((category (intern (string (car name)))))
+	     (unless (get category 'xsdre-unicode-category)
+	       (xsdre-parse-error "%s is not a category" category))
+	     category))
+	  ((null (cddr name))
+	   (let ((category (intern (string (car name) (cadr name)))))
+	     (unless (get category 'xsdre-unicode-category)
+	       (xsdre-parse-error "%s is not a category" category))
+	     category))
+	  ((not (and (eq (car name) ?I)
+		     (eq (cadr name) ?s)))
+	   (xsdre-parse-error "Block name does not start with Is"))
+	  (t
+	   (let ((block (intern (apply 'string (cddr name)))))
+	     (unless (get block 'xsdre-unicode-block)
+	       (xsdre-parse-error "%s is not a block name" block))
+	     block)))))
+
+(defun xsdre-expect (ch)
+  (if (eq (car xsdre-current-regexp) ch)
+      (xsdre-advance)
+    (xsdre-parse-error "Expected %c" ch)))
+    
+(defun xsdre-advance ()
+  (setq xsdre-current-regexp
+	(cdr xsdre-current-regexp)))
+
+(defun xsdre-parse-error (&rest args)
+  (signal 'xsdre-parse-error args))
+
+;; This error condition is used only internally.
+
+(put 'xsdre-parse-error
+     'error-conditions
+     '(error xsdre-parse-error))
+
+(put 'xsdre-parse-error
+     'error-message
+     "Internal error in parsing XSD regexp")
+     
+;;; Character class data
+
+(put 'dot 'xsdre-char-class '(difference any (union #xA #xD)))
+(put 'digit 'xsdre-char-class 'Nd)
+(put 'word 'xsdre-char-class '(difference any (union P Z C)))
+(put 'space 'xsdre-char-class '(union #x9 #xA #xD #x20))
+(put 'any 'xsdre-ranges '((#x0 . #x10FFFF)))
+
+(defconst xsdre-gen-categories
+  '(Lu Ll Lt Lm Lo Mn Mc Me Nd Nl No Pc Pd
+       Ps Pe Pi Pf Po Zs Zl Zp Sm Sc Sk So Cc Cf Co))
+
+(defun xsdre-gen-categories (file)
+  "Use a UnicodeData file to generate code to initialize Unicode categories.
+Code is inserted into the current buffer."
+  (interactive "fUnicodeData file: ")
+  (save-excursion
+    (set-buffer (find-file-noselect file))
+    (goto-char (point-min))
+    (mapcar (lambda (x) (put x 'xsdre-ranges nil)) xsdre-gen-categories)
+    (while (re-search-forward "^\\([0-9A-Fa-f]*\\);[^;]*;\\([A-Z][a-z]\\);"
+			      nil
+			      t)
+      (let* ((sym (intern (match-string-no-properties 2)))
+	     (code (string-to-number (match-string-no-properties 1)
+				     16))
+	     (ranges (get sym 'xsdre-ranges))
+	     (last-range (car ranges))
+	     (forced-range (string= (buffer-substring-no-properties
+				     (- (match-beginning 2) 6)
+				     (1- (match-beginning 2)))
+				    "Last>")))
+	(cond ((and (integerp last-range)
+		    (or forced-range
+			(eq code (1+ last-range))))
+	       (put sym
+		    'xsdre-ranges
+		    (cons (cons last-range code)
+			  (cdr ranges))))
+	      ((and (consp last-range)
+		    (or forced-range
+			(eq code (1+ (cdr last-range)))))
+	       (put sym
+		    'xsdre-ranges
+		    (cons (cons (car last-range) code)
+			  (cdr ranges))))
+	      (t
+	       (put sym 'xsdre-ranges (cons code ranges))))))
+    (mapcar (lambda (x)
+	      (put x
+		   'xsdre-ranges
+		   (nreverse (get x 'xsdre-ranges)))
+	      nil)
+	    xsdre-gen-categories))
+  (mapcar (lambda (x)
+	    (let ((start (point)))
+	      (pp (list 'xsdre-def-primitive-category
+			(list 'quote x)
+			(list 'quote (get x 'xsdre-ranges)))
+		  (current-buffer))
+	      (save-excursion
+		(goto-char start)
+		(down-list 2)
+		(while (condition-case err
+			   (progn 
+			     (forward-sexp)
+			     t)
+			 (error nil))
+		  (when (and (< 70 (current-column))
+			     (not (looking-at ")")))
+		    (insert "\n")
+		    (lisp-indent-line))))))
+	  xsdre-gen-categories))
+
+(defun xsdre-def-primitive-category (sym ranges)
+  (put sym 'xsdre-ranges ranges)
+  (put sym 'xsdre-unicode-category t))
+
+;;; Blocks
+
+(defun xsdre-def-block (sym ranges)
+  (put sym 'xsdre-ranges ranges)
+  (put sym 'xsdre-unicode-block t))
+
+(xsdre-def-block 'BasicLatin '((#x0000 . #x007F)))
+(xsdre-def-block 'Latin-1Supplement '((#x0080 . #x00FF)))
+(xsdre-def-block 'LatinExtended-A '((#x0100 . #x017F)))
+(xsdre-def-block 'LatinExtended-B '((#x0180 . #x024F)))
+(xsdre-def-block 'IPAExtensions '((#x0250 . #x02AF)))
+(xsdre-def-block 'SpacingModifierLetters '((#x02B0 . #x02FF)))
+(xsdre-def-block 'CombiningDiacriticalMarks '((#x0300 . #x036F)))
+(xsdre-def-block 'Greek '((#x0370 . #x03FF)))
+(xsdre-def-block 'Cyrillic '((#x0400 . #x04FF)))
+(xsdre-def-block 'Armenian '((#x0530 . #x058F)))
+(xsdre-def-block 'Hebrew '((#x0590 . #x05FF)))
+(xsdre-def-block 'Arabic '((#x0600 . #x06FF)))
+(xsdre-def-block 'Syriac '((#x0700 . #x074F)))
+(xsdre-def-block 'Thaana '((#x0780 . #x07BF)))
+(xsdre-def-block 'Devanagari '((#x0900 . #x097F)))
+(xsdre-def-block 'Bengali '((#x0980 . #x09FF)))
+(xsdre-def-block 'Gurmukhi '((#x0A00 . #x0A7F)))
+(xsdre-def-block 'Gujarati '((#x0A80 . #x0AFF)))
+(xsdre-def-block 'Oriya '((#x0B00 . #x0B7F)))
+(xsdre-def-block 'Tamil '((#x0B80 . #x0BFF)))
+(xsdre-def-block 'Telugu '((#x0C00 . #x0C7F)))
+(xsdre-def-block 'Kannada '((#x0C80 . #x0CFF)))
+(xsdre-def-block 'Malayalam '((#x0D00 . #x0D7F)))
+(xsdre-def-block 'Sinhala '((#x0D80 . #x0DFF)))
+(xsdre-def-block 'Thai '((#x0E00 . #x0E7F)))
+(xsdre-def-block 'Lao '((#x0E80 . #x0EFF)))
+(xsdre-def-block 'Tibetan '((#x0F00 . #x0FFF)))
+(xsdre-def-block 'Myanmar '((#x1000 . #x109F)))
+(xsdre-def-block 'Georgian '((#x10A0 . #x10FF)))
+(xsdre-def-block 'HangulJamo '((#x1100 . #x11FF)))
+(xsdre-def-block 'Ethiopic '((#x1200 . #x137F)))
+(xsdre-def-block 'Cherokee '((#x13A0 . #x13FF)))
+(xsdre-def-block 'UnifiedCanadianAboriginalSyllabics '((#x1400 . #x167F)))
+(xsdre-def-block 'Ogham '((#x1680 . #x169F)))
+(xsdre-def-block 'Runic '((#x16A0 . #x16FF)))
+(xsdre-def-block 'Khmer '((#x1780 . #x17FF)))
+(xsdre-def-block 'Mongolian '((#x1800 . #x18AF)))
+(xsdre-def-block 'LatinExtendedAdditional '((#x1E00 . #x1EFF)))
+(xsdre-def-block 'GreekExtended '((#x1F00 . #x1FFF)))
+(xsdre-def-block 'GeneralPunctuation '((#x2000 . #x206F)))
+(xsdre-def-block 'SuperscriptsandSubscripts '((#x2070 . #x209F)))
+(xsdre-def-block 'CurrencySymbols '((#x20A0 . #x20CF)))
+(xsdre-def-block 'CombiningMarksforSymbols '((#x20D0 . #x20FF)))
+(xsdre-def-block 'LetterlikeSymbols '((#x2100 . #x214F)))
+(xsdre-def-block 'NumberForms '((#x2150 . #x218F)))
+(xsdre-def-block 'Arrows '((#x2190 . #x21FF)))
+(xsdre-def-block 'MathematicalOperators '((#x2200 . #x22FF)))
+(xsdre-def-block 'MiscellaneousTechnical '((#x2300 . #x23FF)))
+(xsdre-def-block 'ControlPictures '((#x2400 . #x243F)))
+(xsdre-def-block 'OpticalCharacterRecognition '((#x2440 . #x245F)))
+(xsdre-def-block 'EnclosedAlphanumerics '((#x2460 . #x24FF)))
+(xsdre-def-block 'BoxDrawing '((#x2500 . #x257F)))
+(xsdre-def-block 'BlockElements '((#x2580 . #x259F)))
+(xsdre-def-block 'GeometricShapes '((#x25A0 . #x25FF)))
+(xsdre-def-block 'MiscellaneousSymbols '((#x2600 . #x26FF)))
+(xsdre-def-block 'Dingbats '((#x2700 . #x27BF)))
+(xsdre-def-block 'BraillePatterns '((#x2800 . #x28FF)))
+(xsdre-def-block 'CJKRadicalsSupplement '((#x2E80 . #x2EFF)))
+(xsdre-def-block 'KangxiRadicals '((#x2F00 . #x2FDF)))
+(xsdre-def-block 'IdeographicDescriptionCharacters '((#x2FF0 . #x2FFF)))
+(xsdre-def-block 'CJKSymbolsandPunctuation '((#x3000 . #x303F)))
+(xsdre-def-block 'Hiragana '((#x3040 . #x309F)))
+(xsdre-def-block 'Katakana '((#x30A0 . #x30FF)))
+(xsdre-def-block 'Bopomofo '((#x3100 . #x312F)))
+(xsdre-def-block 'HangulCompatibilityJamo '((#x3130 . #x318F)))
+(xsdre-def-block 'Kanbun '((#x3190 . #x319F)))
+(xsdre-def-block 'BopomofoExtended '((#x31A0 . #x31BF)))
+(xsdre-def-block 'EnclosedCJKLettersandMonths '((#x3200 . #x32FF)))
+(xsdre-def-block 'CJKCompatibility '((#x3300 . #x33FF)))
+(xsdre-def-block 'CJKUnifiedIdeographsExtensionA '((#x3400 . #x4DB5)))
+(xsdre-def-block 'CJKUnifiedIdeographs '((#x4E00 . #x9FFF)))
+(xsdre-def-block 'YiSyllables '((#xA000 . #xA48F)))
+(xsdre-def-block 'YiRadicals '((#xA490 . #xA4CF)))
+(xsdre-def-block 'HangulSyllables '((#xAC00 . #xD7A3)))
+;;(xsdre-def-block 'HighSurrogates '((#xD800 . #xDB7F)))
+;;(xsdre-def-block 'HighPrivateUseSurrogates '((#xDB80 . #xDBFF)))
+;;(xsdre-def-block 'LowSurrogates '((#xDC00 . #xDFFF)))
+(xsdre-def-block 'CJKCompatibilityIdeographs '((#xF900 . #xFAFF)))
+(xsdre-def-block 'AlphabeticPresentationForms '((#xFB00 . #xFB4F)))
+(xsdre-def-block 'ArabicPresentationForms-A '((#xFB50 . #xFDFF)))
+(xsdre-def-block 'CombiningHalfMarks '((#xFE20 . #xFE2F)))
+(xsdre-def-block 'CJKCompatibilityForms '((#xFE30 . #xFE4F)))
+(xsdre-def-block 'SmallFormVariants '((#xFE50 . #xFE6F)))
+(xsdre-def-block 'ArabicPresentationForms-B '((#xFE70 . #xFEFE)))
+(xsdre-def-block 'Specials '((#xFEFF . #xFEFF)))
+(xsdre-def-block 'HalfwidthandFullwidthForms '((#xFF00 . #xFFEF)))
+(xsdre-def-block 'Specials '((#xFFF0 . #xFFFD)))
+(xsdre-def-block 'OldItalic '((#x10300 . #x1032F)))
+(xsdre-def-block 'Gothic '((#x10330 . #x1034F)))
+(xsdre-def-block 'Deseret '((#x10400 . #x1044F)))
+(xsdre-def-block 'ByzantineMusicalSymbols '((#x1D000 . #x1D0FF)))
+(xsdre-def-block 'MusicalSymbols '((#x1D100 . #x1D1FF)))
+(xsdre-def-block 'MathematicalAlphanumericSymbols '((#x1D400 . #x1D7FF)))
+(xsdre-def-block 'CJKUnifiedIdeographsExtensionB '((#x20000 . #x2A6D6)))
+(xsdre-def-block 'CJKCompatibilityIdeographsSupplement '((#x2F800 . #x2FA1F)))
+(xsdre-def-block 'Tags '((#xE0000 . #xE007F)))
+(xsdre-def-block 'PrivateUse '((#xE000 . #xF8FF)
+			       (#xF0000 . #xFFFFD)
+			       (#x100000 . #x10FFFD)))
+
+;;; Categories
+
+;;; Derived categories
+
+(defun xsdre-def-derived-category (sym char-class)
+  (put sym 'xsdre-char-class char-class)
+  (put sym 'xsdre-unicode-category t))
+
+(xsdre-def-derived-category 'L '(union Lu Ll Lt Lm Lo))
+(xsdre-def-derived-category 'M '(union Mn Mc Me))
+(xsdre-def-derived-category 'N '(union Nd Nl No))
+(xsdre-def-derived-category 'P '(union Pc Pd Ps Pe Pi Pf Po))
+(xsdre-def-derived-category 'Z '(union Zs Zl Zp))
+(xsdre-def-derived-category 'S '(union Sm Sc Sk So))
+(xsdre-def-derived-category 'C '(union Cc Cf Co Cn))
+(xsdre-def-derived-category 'Cn '(difference any
+					     (union L M N P Z S Cc Cf Co)))
+
+(xsdre-def-primitive-category
+ 'name-initial
+ '(#x003a
+   (#x0041 . #x005a)
+   #x005f
+   (#x0061 . #x007a)
+   (#x00c0 . #x00d6)
+   (#x00d8 . #x00f6)
+   (#x00f8 . #x0131)
+   (#x0134 . #x013e)
+   (#x0141 . #x0148)
+   (#x014a . #x017e)
+   (#x0180 . #x01c3)
+   (#x01cd . #x01f0)
+   (#x01f4 . #x01f5)
+   (#x01fa . #x0217)
+   (#x0250 . #x02a8)
+   (#x02bb . #x02c1)
+   #x0386
+   (#x0388 . #x038a)
+   #x038c
+   (#x038e . #x03a1)
+   (#x03a3 . #x03ce)
+   (#x03d0 . #x03d6)
+   #x03da
+   #x03dc
+   #x03de
+   #x03e0
+   (#x03e2 . #x03f3)
+   (#x0401 . #x040c)
+   (#x040e . #x044f)
+   (#x0451 . #x045c)
+   (#x045e . #x0481)
+   (#x0490 . #x04c4)
+   (#x04c7 . #x04c8)
+   (#x04cb . #x04cc)
+   (#x04d0 . #x04eb)
+   (#x04ee . #x04f5)
+   (#x04f8 . #x04f9)
+   (#x0531 . #x0556)
+   #x0559
+   (#x0561 . #x0586)
+   (#x05d0 . #x05ea)
+   (#x05f0 . #x05f2)
+   (#x0621 . #x063a)
+   (#x0641 . #x064a)
+   (#x0671 . #x06b7)
+   (#x06ba . #x06be)
+   (#x06c0 . #x06ce)
+   (#x06d0 . #x06d3)
+   #x06d5
+   (#x06e5 . #x06e6)
+   (#x0905 . #x0939)
+   #x093d
+   (#x0958 . #x0961)
+   (#x0985 . #x098c)
+   (#x098f . #x0990)
+   (#x0993 . #x09a8)
+   (#x09aa . #x09b0)
+   #x09b2
+   (#x09b6 . #x09b9)
+   (#x09dc . #x09dd)
+   (#x09df . #x09e1)
+   (#x09f0 . #x09f1)
+   (#x0a05 . #x0a0a)
+   (#x0a0f . #x0a10)
+   (#x0a13 . #x0a28)
+   (#x0a2a . #x0a30)
+   (#x0a32 . #x0a33)
+   (#x0a35 . #x0a36)
+   (#x0a38 . #x0a39)
+   (#x0a59 . #x0a5c)
+   #x0a5e
+   (#x0a72 . #x0a74)
+   (#x0a85 . #x0a8b)
+   #x0a8d
+   (#x0a8f . #x0a91)
+   (#x0a93 . #x0aa8)
+   (#x0aaa . #x0ab0)
+   (#x0ab2 . #x0ab3)
+   (#x0ab5 . #x0ab9)
+   #x0abd
+   #x0ae0
+   (#x0b05 . #x0b0c)
+   (#x0b0f . #x0b10)
+   (#x0b13 . #x0b28)
+   (#x0b2a . #x0b30)
+   (#x0b32 . #x0b33)
+   (#x0b36 . #x0b39)
+   #x0b3d
+   (#x0b5c . #x0b5d)
+   (#x0b5f . #x0b61)
+   (#x0b85 . #x0b8a)
+   (#x0b8e . #x0b90)
+   (#x0b92 . #x0b95)
+   (#x0b99 . #x0b9a)
+   #x0b9c
+   (#x0b9e . #x0b9f)
+   (#x0ba3 . #x0ba4)
+   (#x0ba8 . #x0baa)
+   (#x0bae . #x0bb5)
+   (#x0bb7 . #x0bb9)
+   (#x0c05 . #x0c0c)
+   (#x0c0e . #x0c10)
+   (#x0c12 . #x0c28)
+   (#x0c2a . #x0c33)
+   (#x0c35 . #x0c39)
+   (#x0c60 . #x0c61)
+   (#x0c85 . #x0c8c)
+   (#x0c8e . #x0c90)
+   (#x0c92 . #x0ca8)
+   (#x0caa . #x0cb3)
+   (#x0cb5 . #x0cb9)
+   #x0cde
+   (#x0ce0 . #x0ce1)
+   (#x0d05 . #x0d0c)
+   (#x0d0e . #x0d10)
+   (#x0d12 . #x0d28)
+   (#x0d2a . #x0d39)
+   (#x0d60 . #x0d61)
+   (#x0e01 . #x0e2e)
+   #x0e30
+   (#x0e32 . #x0e33)
+   (#x0e40 . #x0e45)
+   (#x0e81 . #x0e82)
+   #x0e84
+   (#x0e87 . #x0e88)
+   #x0e8a
+   #x0e8d
+   (#x0e94 . #x0e97)
+   (#x0e99 . #x0e9f)
+   (#x0ea1 . #x0ea3)
+   #x0ea5
+   #x0ea7
+   (#x0eaa . #x0eab)
+   (#x0ead . #x0eae)
+   #x0eb0
+   (#x0eb2 . #x0eb3)
+   #x0ebd
+   (#x0ec0 . #x0ec4)
+   (#x0f40 . #x0f47)
+   (#x0f49 . #x0f69)
+   (#x10a0 . #x10c5)
+   (#x10d0 . #x10f6)
+   #x1100
+   (#x1102 . #x1103)
+   (#x1105 . #x1107)
+   #x1109
+   (#x110b . #x110c)
+   (#x110e . #x1112)
+   #x113c
+   #x113e
+   #x1140
+   #x114c
+   #x114e
+   #x1150
+   (#x1154 . #x1155)
+   #x1159
+   (#x115f . #x1161)
+   #x1163
+   #x1165
+   #x1167
+   #x1169
+   (#x116d . #x116e)
+   (#x1172 . #x1173)
+   #x1175
+   #x119e
+   #x11a8
+   #x11ab
+   (#x11ae . #x11af)
+   (#x11b7 . #x11b8)
+   #x11ba
+   (#x11bc . #x11c2)
+   #x11eb
+   #x11f0
+   #x11f9
+   (#x1e00 . #x1e9b)
+   (#x1ea0 . #x1ef9)
+   (#x1f00 . #x1f15)
+   (#x1f18 . #x1f1d)
+   (#x1f20 . #x1f45)
+   (#x1f48 . #x1f4d)
+   (#x1f50 . #x1f57)
+   #x1f59
+   #x1f5b
+   #x1f5d
+   (#x1f5f . #x1f7d)
+   (#x1f80 . #x1fb4)
+   (#x1fb6 . #x1fbc)
+   #x1fbe
+   (#x1fc2 . #x1fc4)
+   (#x1fc6 . #x1fcc)
+   (#x1fd0 . #x1fd3)
+   (#x1fd6 . #x1fdb)
+   (#x1fe0 . #x1fec)
+   (#x1ff2 . #x1ff4)
+   (#x1ff6 . #x1ffc)
+   #x2126
+   (#x212a . #x212b)
+   #x212e
+   (#x2180 . #x2182)
+   #x3007
+   (#x3021 . #x3029)
+   (#x3041 . #x3094)
+   (#x30a1 . #x30fa)
+   (#x3105 . #x312c)
+   (#x4e00 . #x9fa5)
+   (#xac00 . #xd7a3)))
+
+(xsdre-def-derived-category 'name-continue '(union name-initial
+						   name-continue-not-initial))
+			  
+(xsdre-def-primitive-category 
+ 'name-continue-not-initial
+ '((#x002d . #x002e)
+   (#x0030 . #x0039)
+   #x00b7
+   (#x02d0 . #x02d1)
+   (#x0300 . #x0345)
+   (#x0360 . #x0361)
+   #x0387
+   (#x0483 . #x0486)
+   (#x0591 . #x05a1)
+   (#x05a3 . #x05b9)
+   (#x05bb . #x05bd)
+   #x05bf
+   (#x05c1 . #x05c2)
+   #x05c4
+   #x0640
+   (#x064b . #x0652)
+   (#x0660 . #x0669)
+   #x0670
+   (#x06d6 . #x06dc)
+   (#x06dd . #x06df)
+   (#x06e0 . #x06e4)
+   (#x06e7 . #x06e8)
+   (#x06ea . #x06ed)
+   (#x06f0 . #x06f9)
+   (#x0901 . #x0903)
+   #x093c
+   (#x093e . #x094c)
+   #x094d
+   (#x0951 . #x0954)
+   (#x0962 . #x0963)
+   (#x0966 . #x096f)
+   (#x0981 . #x0983)
+   #x09bc
+   (#x09be . #x09bf)
+   (#x09c0 . #x09c4)
+   (#x09c7 . #x09c8)
+   (#x09cb . #x09cd)
+   #x09d7
+   (#x09e2 . #x09e3)
+   (#x09e6 . #x09ef)
+   #x0a02
+   #x0a3c
+   (#x0a3e . #x0a42)
+   (#x0a47 . #x0a48)
+   (#x0a4b . #x0a4d)
+   (#x0a66 . #x0a6f)
+   (#x0a70 . #x0a71)
+   (#x0a81 . #x0a83)
+   #x0abc
+   (#x0abe . #x0ac5)
+   (#x0ac7 . #x0ac9)
+   (#x0acb . #x0acd)
+   (#x0ae6 . #x0aef)
+   (#x0b01 . #x0b03)
+   #x0b3c
+   (#x0b3e . #x0b43)
+   (#x0b47 . #x0b48)
+   (#x0b4b . #x0b4d)
+   (#x0b56 . #x0b57)
+   (#x0b66 . #x0b6f)
+   (#x0b82 . #x0b83)
+   (#x0bbe . #x0bc2)
+   (#x0bc6 . #x0bc8)
+   (#x0bca . #x0bcd)
+   #x0bd7
+   (#x0be7 . #x0bef)
+   (#x0c01 . #x0c03)
+   (#x0c3e . #x0c44)
+   (#x0c46 . #x0c48)
+   (#x0c4a . #x0c4d)
+   (#x0c55 . #x0c56)
+   (#x0c66 . #x0c6f)
+   (#x0c82 . #x0c83)
+   (#x0cbe . #x0cc4)
+   (#x0cc6 . #x0cc8)
+   (#x0cca . #x0ccd)
+   (#x0cd5 . #x0cd6)
+   (#x0ce6 . #x0cef)
+   (#x0d02 . #x0d03)
+   (#x0d3e . #x0d43)
+   (#x0d46 . #x0d48)
+   (#x0d4a . #x0d4d)
+   #x0d57
+   (#x0d66 . #x0d6f)
+   #x0e31
+   (#x0e34 . #x0e3a)
+   (#x0e46 . #x0e4e)
+   (#x0e50 . #x0e59)
+   #x0eb1
+   (#x0eb4 . #x0eb9)
+   (#x0ebb . #x0ebc)
+   #x0ec6
+   (#x0ec8 . #x0ecd)
+   (#x0ed0 . #x0ed9)
+   (#x0f18 . #x0f19)
+   (#x0f20 . #x0f29)
+   #x0f35
+   #x0f37
+   #x0f39
+   (#x0f3e . #x0f3f)
+   (#x0f71 . #x0f84)
+   (#x0f86 . #x0f8b)
+   (#x0f90 . #x0f95)
+   #x0f97
+   (#x0f99 . #x0fad)
+   (#x0fb1 . #x0fb7)
+   #x0fb9
+   (#x20d0 . #x20dc)
+   #x20e1
+   #x3005
+   (#x302a . #x302f)
+   (#x3031 . #x3035)
+   #x3099
+   #x309a
+   (#x309d . #x309e)
+   (#x30fc . #x30fe)))
+
+;;; Auto-generated section.
+
+;; The rest of the file was auto-generated by doing M-x xsdre-gen-categories
+;; on UnicodeData-3.1.0.txt available from
+;; http://www.unicode.org/Public/3.1-Update/UnicodeData-3.1.0.txt
+
+(xsdre-def-primitive-category 'Lu
+			      '((65 . 90)
+				(192 . 214)
+				(216 . 222)
+				256 258 260 262 264 266 268 270 272 274 276
+				278 280 282 284 286 288 290 292 294 296 298
+				300 302 304 306 308 310 313 315 317 319 321
+				323 325 327 330 332 334 336 338 340 342 344
+				346 348 350 352 354 356 358 360 362 364 366
+				368 370 372 374
+				(376 . 377)
+				379 381
+				(385 . 386)
+				388
+				(390 . 391)
+				(393 . 395)
+				(398 . 401)
+				(403 . 404)
+				(406 . 408)
+				(412 . 413)
+				(415 . 416)
+				418 420
+				(422 . 423)
+				425 428
+				(430 . 431)
+				(433 . 435)
+				437
+				(439 . 440)
+				444 452 455 458 461 463 465 467 469 471 473
+				475 478 480 482 484 486 488 490 492 494 497
+				500
+				(502 . 504)
+				506 508 510 512 514 516 518 520 522 524 526
+				528 530 532 534 536 538 540 542 546 548 550
+				552 554 556 558 560 562 902
+				(904 . 906)
+				908
+				(910 . 911)
+				(913 . 929)
+				(931 . 939)
+				(978 . 980)
+				986 988 990 992 994 996 998 1000 1002 1004
+				1006 1012
+				(1024 . 1071)
+				1120 1122 1124 1126 1128 1130 1132 1134 1136
+				1138 1140 1142 1144 1146 1148 1150 1152 1164
+				1166 1168 1170 1172 1174 1176 1178 1180 1182
+				1184 1186 1188 1190 1192 1194 1196 1198 1200
+				1202 1204 1206 1208 1210 1212 1214
+				(1216 . 1217)
+				1219 1223 1227 1232 1234 1236 1238 1240 1242
+				1244 1246 1248 1250 1252 1254 1256 1258 1260
+				1262 1264 1266 1268 1272
+				(1329 . 1366)
+				(4256 . 4293)
+				7680 7682 7684 7686 7688 7690 7692 7694 7696
+				7698 7700 7702 7704 7706 7708 7710 7712 7714
+				7716 7718 7720 7722 7724 7726 7728 7730 7732
+				7734 7736 7738 7740 7742 7744 7746 7748 7750
+				7752 7754 7756 7758 7760 7762 7764 7766 7768
+				7770 7772 7774 7776 7778 7780 7782 7784 7786
+				7788 7790 7792 7794 7796 7798 7800 7802 7804
+				7806 7808 7810 7812 7814 7816 7818 7820 7822
+				7824 7826 7828 7840 7842 7844 7846 7848 7850
+				7852 7854 7856 7858 7860 7862 7864 7866 7868
+				7870 7872 7874 7876 7878 7880 7882 7884 7886
+				7888 7890 7892 7894 7896 7898 7900 7902 7904
+				7906 7908 7910 7912 7914 7916 7918 7920 7922
+				7924 7926 7928
+				(7944 . 7951)
+				(7960 . 7965)
+				(7976 . 7983)
+				(7992 . 7999)
+				(8008 . 8013)
+				8025 8027 8029 8031
+				(8040 . 8047)
+				(8120 . 8123)
+				(8136 . 8139)
+				(8152 . 8155)
+				(8168 . 8172)
+				(8184 . 8187)
+				8450 8455
+				(8459 . 8461)
+				(8464 . 8466)
+				8469
+				(8473 . 8477)
+				8484 8486 8488
+				(8490 . 8493)
+				(8496 . 8497)
+				8499
+				(65313 . 65338)
+				(66560 . 66597)
+				(119808 . 119833)
+				(119860 . 119885)
+				(119912 . 119937)
+				119964
+				(119966 . 119967)
+				119970
+				(119973 . 119974)
+				(119977 . 119980)
+				(119982 . 119989)
+				(120016 . 120041)
+				(120068 . 120069)
+				(120071 . 120074)
+				(120077 . 120084)
+				(120086 . 120092)
+				(120120 . 120121)
+				(120123 . 120126)
+				(120128 . 120132)
+				120134
+				(120138 . 120144)
+				(120172 . 120197)
+				(120224 . 120249)
+				(120276 . 120301)
+				(120328 . 120353)
+				(120380 . 120405)
+				(120432 . 120457)
+				(120488 . 120512)
+				(120546 . 120570)
+				(120604 . 120628)
+				(120662 . 120686)
+				(120720 . 120744)))
+(xsdre-def-primitive-category 'Ll
+			      '((97 . 122)
+				170 181 186
+				(223 . 246)
+				(248 . 255)
+				257 259 261 263 265 267 269 271 273 275 277
+				279 281 283 285 287 289 291 293 295 297 299
+				301 303 305 307 309
+				(311 . 312)
+				314 316 318 320 322 324 326
+				(328 . 329)
+				331 333 335 337 339 341 343 345 347 349 351
+				353 355 357 359 361 363 365 367 369 371 373
+				375 378 380
+				(382 . 384)
+				387 389 392
+				(396 . 397)
+				402 405
+				(409 . 411)
+				414 417 419 421 424
+				(426 . 427)
+				429 432 436 438
+				(441 . 442)
+				(445 . 447)
+				454 457 460 462 464 466 468 470 472 474
+				(476 . 477)
+				479 481 483 485 487 489 491 493
+				(495 . 496)
+				499 501 505 507 509 511 513 515 517 519 521
+				523 525 527 529 531 533 535 537 539 541 543
+				547 549 551 553 555 557 559 561 563
+				(592 . 685)
+				912
+				(940 . 974)
+				(976 . 977)
+				(981 . 983)
+				987 989 991 993 995 997 999 1001 1003 1005
+			      
+				(1007 . 1011)
+				1013
+				(1072 . 1119)
+				1121 1123 1125 1127 1129 1131 1133 1135 1137
+				1139 1141 1143 1145 1147 1149 1151 1153 1165
+				1167 1169 1171 1173 1175 1177 1179 1181 1183
+				1185 1187 1189 1191 1193 1195 1197 1199 1201
+				1203 1205 1207 1209 1211 1213 1215 1218 1220
+				1224 1228 1233 1235 1237 1239 1241 1243 1245
+				1247 1249 1251 1253 1255 1257 1259 1261 1263
+				1265 1267 1269 1273
+				(1377 . 1415)
+				7681 7683 7685 7687 7689 7691 7693 7695 7697
+				7699 7701 7703 7705 7707 7709 7711 7713 7715
+				7717 7719 7721 7723 7725 7727 7729 7731 7733
+				7735 7737 7739 7741 7743 7745 7747 7749 7751
+				7753 7755 7757 7759 7761 7763 7765 7767 7769
+				7771 7773 7775 7777 7779 7781 7783 7785 7787
+				7789 7791 7793 7795 7797 7799 7801 7803 7805
+				7807 7809 7811 7813 7815 7817 7819 7821 7823
+				7825 7827
+				(7829 . 7835)
+				7841 7843 7845 7847 7849 7851 7853 7855 7857
+				7859 7861 7863 7865 7867 7869 7871 7873 7875
+				7877 7879 7881 7883 7885 7887 7889 7891 7893
+				7895 7897 7899 7901 7903 7905 7907 7909 7911
+				7913 7915 7917 7919 7921 7923 7925 7927 7929
+			      
+				(7936 . 7943)
+				(7952 . 7957)
+				(7968 . 7975)
+				(7984 . 7991)
+				(8000 . 8005)
+				(8016 . 8023)
+				(8032 . 8039)
+				(8048 . 8061)
+				(8064 . 8071)
+				(8080 . 8087)
+				(8096 . 8103)
+				(8112 . 8116)
+				(8118 . 8119)
+				8126
+				(8130 . 8132)
+				(8134 . 8135)
+				(8144 . 8147)
+				(8150 . 8151)
+				(8160 . 8167)
+				(8178 . 8180)
+				(8182 . 8183)
+				8319 8458
+				(8462 . 8463)
+				8467 8495 8500 8505
+				(64256 . 64262)
+				(64275 . 64279)
+				(65345 . 65370)
+				(66600 . 66637)
+				(119834 . 119859)
+				(119886 . 119892)
+				(119894 . 119911)
+				(119938 . 119963)
+				(119990 . 119993)
+				119995
+				(119997 . 120000)
+				(120002 . 120003)
+				(120005 . 120015)
+				(120042 . 120067)
+				(120094 . 120119)
+				(120146 . 120171)
+				(120198 . 120223)
+				(120250 . 120275)
+				(120302 . 120327)
+				(120354 . 120379)
+				(120406 . 120431)
+				(120458 . 120483)
+				(120514 . 120538)
+				(120540 . 120545)
+				(120572 . 120596)
+				(120598 . 120603)
+				(120630 . 120654)
+				(120656 . 120661)
+				(120688 . 120712)
+				(120714 . 120719)
+				(120746 . 120770)
+				(120772 . 120777)))
+(xsdre-def-primitive-category 'Lt
+			      '(453 456 459 498
+				    (8072 . 8079)
+				    (8088 . 8095)
+				    (8104 . 8111)
+				    8124 8140 8188))
+(xsdre-def-primitive-category 'Lm
+			      '((688 . 696)
+				(699 . 705)
+				(720 . 721)
+				(736 . 740)
+				750 890 1369 1600
+				(1765 . 1766)
+				3654 3782 6211 12293
+				(12337 . 12341)
+				(12445 . 12446)
+				(12540 . 12542)
+				65392
+				(65438 . 65439)))
+(xsdre-def-primitive-category 'Lo
+			      '(443
+				(448 . 451)
+				(1488 . 1514)
+				(1520 . 1522)
+				(1569 . 1594)
+				(1601 . 1610)
+				(1649 . 1747)
+				1749
+				(1786 . 1788)
+				1808
+				(1810 . 1836)
+				(1920 . 1957)
+				(2309 . 2361)
+				2365 2384
+				(2392 . 2401)
+				(2437 . 2444)
+				(2447 . 2448)
+				(2451 . 2472)
+				(2474 . 2480)
+				2482
+				(2486 . 2489)
+				(2524 . 2525)
+				(2527 . 2529)
+				(2544 . 2545)
+				(2565 . 2570)
+				(2575 . 2576)
+				(2579 . 2600)
+				(2602 . 2608)
+				(2610 . 2611)
+				(2613 . 2614)
+				(2616 . 2617)
+				(2649 . 2652)
+				2654
+				(2674 . 2676)
+				(2693 . 2699)
+				2701
+				(2703 . 2705)
+				(2707 . 2728)
+				(2730 . 2736)
+				(2738 . 2739)
+				(2741 . 2745)
+				2749 2768 2784
+				(2821 . 2828)
+				(2831 . 2832)
+				(2835 . 2856)
+				(2858 . 2864)
+				(2866 . 2867)
+				(2870 . 2873)
+				2877
+				(2908 . 2909)
+				(2911 . 2913)
+				(2949 . 2954)
+				(2958 . 2960)
+				(2962 . 2965)
+				(2969 . 2970)
+				2972
+				(2974 . 2975)
+				(2979 . 2980)
+				(2984 . 2986)
+				(2990 . 2997)
+				(2999 . 3001)
+				(3077 . 3084)
+				(3086 . 3088)
+				(3090 . 3112)
+				(3114 . 3123)
+				(3125 . 3129)
+				(3168 . 3169)
+				(3205 . 3212)
+				(3214 . 3216)
+				(3218 . 3240)
+				(3242 . 3251)
+				(3253 . 3257)
+				3294
+				(3296 . 3297)
+				(3333 . 3340)
+				(3342 . 3344)
+				(3346 . 3368)
+				(3370 . 3385)
+				(3424 . 3425)
+				(3461 . 3478)
+				(3482 . 3505)
+				(3507 . 3515)
+				3517
+				(3520 . 3526)
+				(3585 . 3632)
+				(3634 . 3635)
+				(3648 . 3653)
+				(3713 . 3714)
+				3716
+				(3719 . 3720)
+				3722 3725
+				(3732 . 3735)
+				(3737 . 3743)
+				(3745 . 3747)
+				3749 3751
+				(3754 . 3755)
+				(3757 . 3760)
+				(3762 . 3763)
+				3773
+				(3776 . 3780)
+				(3804 . 3805)
+				3840
+				(3904 . 3911)
+				(3913 . 3946)
+				(3976 . 3979)
+				(4096 . 4129)
+				(4131 . 4135)
+				(4137 . 4138)
+				(4176 . 4181)
+				(4304 . 4342)
+				(4352 . 4441)
+				(4447 . 4514)
+				(4520 . 4601)
+				(4608 . 4614)
+				(4616 . 4678)
+				4680
+				(4682 . 4685)
+				(4688 . 4694)
+				4696
+				(4698 . 4701)
+				(4704 . 4742)
+				4744
+				(4746 . 4749)
+				(4752 . 4782)
+				4784
+				(4786 . 4789)
+				(4792 . 4798)
+				4800
+				(4802 . 4805)
+				(4808 . 4814)
+				(4816 . 4822)
+				(4824 . 4846)
+				(4848 . 4878)
+				4880
+				(4882 . 4885)
+				(4888 . 4894)
+				(4896 . 4934)
+				(4936 . 4954)
+				(5024 . 5108)
+				(5121 . 5740)
+				(5743 . 5750)
+				(5761 . 5786)
+				(5792 . 5866)
+				(6016 . 6067)
+				(6176 . 6210)
+				(6212 . 6263)
+				(6272 . 6312)
+				(8501 . 8504)
+				12294
+				(12353 . 12436)
+				(12449 . 12538)
+				(12549 . 12588)
+				(12593 . 12686)
+				(12704 . 12727)
+				(13312 . 19893)
+				(19968 . 40869)
+				(40960 . 42124)
+				(44032 . 55203)
+				(63744 . 64045)
+				64285
+				(64287 . 64296)
+				(64298 . 64310)
+				(64312 . 64316)
+				64318
+				(64320 . 64321)
+				(64323 . 64324)
+				(64326 . 64433)
+				(64467 . 64829)
+				(64848 . 64911)
+				(64914 . 64967)
+				(65008 . 65019)
+				(65136 . 65138)
+				65140
+				(65142 . 65276)
+				(65382 . 65391)
+				(65393 . 65437)
+				(65440 . 65470)
+				(65474 . 65479)
+				(65482 . 65487)
+				(65490 . 65495)
+				(65498 . 65500)
+				(66304 . 66334)
+				(66352 . 66377)
+				(131072 . 173782)
+				(194560 . 195101)))
+(xsdre-def-primitive-category 'Mn
+			      '((768 . 846)
+				(864 . 866)
+				(1155 . 1158)
+				(1425 . 1441)
+				(1443 . 1465)
+				(1467 . 1469)
+				1471
+				(1473 . 1474)
+				1476
+				(1611 . 1621)
+				1648
+				(1750 . 1756)
+				(1759 . 1764)
+				(1767 . 1768)
+				(1770 . 1773)
+				1809
+				(1840 . 1866)
+				(1958 . 1968)
+				(2305 . 2306)
+				2364
+				(2369 . 2376)
+				2381
+				(2385 . 2388)
+				(2402 . 2403)
+				2433 2492
+				(2497 . 2500)
+				2509
+				(2530 . 2531)
+				2562 2620
+				(2625 . 2626)
+				(2631 . 2632)
+				(2635 . 2637)
+				(2672 . 2673)
+				(2689 . 2690)
+				2748
+				(2753 . 2757)
+				(2759 . 2760)
+				2765 2817 2876 2879
+				(2881 . 2883)
+				2893 2902 2946 3008 3021
+				(3134 . 3136)
+				(3142 . 3144)
+				(3146 . 3149)
+				(3157 . 3158)
+				3263 3270
+				(3276 . 3277)
+				(3393 . 3395)
+				3405 3530
+				(3538 . 3540)
+				3542 3633
+				(3636 . 3642)
+				(3655 . 3662)
+				3761
+				(3764 . 3769)
+				(3771 . 3772)
+				(3784 . 3789)
+				(3864 . 3865)
+				3893 3895 3897
+				(3953 . 3966)
+				(3968 . 3972)
+				(3974 . 3975)
+				(3984 . 3991)
+				(3993 . 4028)
+				4038
+				(4141 . 4144)
+				4146
+				(4150 . 4151)
+				4153
+				(4184 . 4185)
+				(6071 . 6077)
+				6086
+				(6089 . 6099)
+				6313
+				(8400 . 8412)
+				8417
+				(12330 . 12335)
+				(12441 . 12442)
+				64286
+				(65056 . 65059)
+				(119143 . 119145)
+				(119163 . 119170)
+				(119173 . 119179)
+				(119210 . 119213)))
+(xsdre-def-primitive-category 'Mc
+			      '(2307
+				(2366 . 2368)
+				(2377 . 2380)
+				(2434 . 2435)
+				(2494 . 2496)
+				(2503 . 2504)
+				(2507 . 2508)
+				2519
+				(2622 . 2624)
+				2691
+				(2750 . 2752)
+				2761
+				(2763 . 2764)
+				(2818 . 2819)
+				2878 2880
+				(2887 . 2888)
+				(2891 . 2892)
+				2903 2947
+				(3006 . 3007)
+				(3009 . 3010)
+				(3014 . 3016)
+				(3018 . 3020)
+				3031
+				(3073 . 3075)
+				(3137 . 3140)
+				(3202 . 3203)
+				3262
+				(3264 . 3268)
+				(3271 . 3272)
+				(3274 . 3275)
+				(3285 . 3286)
+				(3330 . 3331)
+				(3390 . 3392)
+				(3398 . 3400)
+				(3402 . 3404)
+				3415
+				(3458 . 3459)
+				(3535 . 3537)
+				(3544 . 3551)
+				(3570 . 3571)
+				(3902 . 3903)
+				3967 4140 4145 4152
+				(4182 . 4183)
+				(6068 . 6070)
+				(6078 . 6085)
+				(6087 . 6088)
+				(119141 . 119142)
+				(119149 . 119154)))
+(xsdre-def-primitive-category 'Me
+			      '((1160 . 1161)
+				(1757 . 1758)
+				(8413 . 8416)
+				(8418 . 8419)))
+(xsdre-def-primitive-category 'Nd
+			      '((48 . 57)
+				(1632 . 1641)
+				(1776 . 1785)
+				(2406 . 2415)
+				(2534 . 2543)
+				(2662 . 2671)
+				(2790 . 2799)
+				(2918 . 2927)
+				(3047 . 3055)
+				(3174 . 3183)
+				(3302 . 3311)
+				(3430 . 3439)
+				(3664 . 3673)
+				(3792 . 3801)
+				(3872 . 3881)
+				(4160 . 4169)
+				(4969 . 4977)
+				(6112 . 6121)
+				(6160 . 6169)
+				(65296 . 65305)
+				(120782 . 120831)))
+(xsdre-def-primitive-category 'Nl
+			      '((5870 . 5872)
+				(8544 . 8579)
+				12295
+				(12321 . 12329)
+				(12344 . 12346)
+				66378))
+(xsdre-def-primitive-category 'No
+			      '((178 . 179)
+				185
+				(188 . 190)
+				(2548 . 2553)
+				(3056 . 3058)
+				(3882 . 3891)
+				(4978 . 4988)
+				8304
+				(8308 . 8313)
+				(8320 . 8329)
+				(8531 . 8543)
+				(9312 . 9371)
+				9450
+				(10102 . 10131)
+				(12690 . 12693)
+				(12832 . 12841)
+				(12928 . 12937)
+				(66336 . 66339)))
+(xsdre-def-primitive-category 'Pc
+			      '(95
+				(8255 . 8256)
+				12539
+				(65075 . 65076)
+				(65101 . 65103)
+				65343 65381))
+(xsdre-def-primitive-category 'Pd
+			      '(45 173 1418 6150
+				   (8208 . 8213)
+				   12316 12336
+				   (65073 . 65074)
+				   65112 65123 65293))
+(xsdre-def-primitive-category 'Ps
+			      '(40 91 123 3898 3900 5787 8218 8222 8261 8317
+				   8333 9001 12296 12298 12300 12302 12304
+				   12308 12310 12312 12314 12317 64830 65077
+				   65079 65081 65083 65085 65087 65089 65091
+				   65113 65115 65117 65288 65339 65371 65378))
+(xsdre-def-primitive-category 'Pe
+			      '(41 93 125 3899 3901 5788 8262 8318 8334 9002
+				   12297 12299 12301 12303 12305 12309 12311
+				   12313 12315
+				   (12318 . 12319)
+				   64831 65078 65080 65082 65084 65086 65088
+				   65090 65092 65114 65116 65118 65289 65341
+				   65373 65379))
+(xsdre-def-primitive-category 'Pi
+			      '(171 8216
+				    (8219 . 8220)
+				    8223 8249))
+(xsdre-def-primitive-category 'Pf
+			      '(187 8217 8221 8250))
+(xsdre-def-primitive-category 'Po
+			      '((33 . 35)
+				(37 . 39)
+				42 44
+				(46 . 47)
+				(58 . 59)
+				(63 . 64)
+				92 161 183 191 894 903
+				(1370 . 1375)
+				1417 1470 1472 1475
+				(1523 . 1524)
+				1548 1563 1567
+				(1642 . 1645)
+				1748
+				(1792 . 1805)
+				(2404 . 2405)
+				2416 3572 3663
+				(3674 . 3675)
+				(3844 . 3858)
+				3973
+				(4170 . 4175)
+				4347
+				(4961 . 4968)
+				(5741 . 5742)
+				(5867 . 5869)
+				(6100 . 6106)
+				6108
+				(6144 . 6149)
+				(6151 . 6154)
+				(8214 . 8215)
+				(8224 . 8231)
+				(8240 . 8248)
+				(8251 . 8254)
+				(8257 . 8259)
+				(8264 . 8269)
+				(12289 . 12291)
+				65072
+				(65097 . 65100)
+				(65104 . 65106)
+				(65108 . 65111)
+				(65119 . 65121)
+				65128
+				(65130 . 65131)
+				(65281 . 65283)
+				(65285 . 65287)
+				65290 65292
+				(65294 . 65295)
+				(65306 . 65307)
+				(65311 . 65312)
+				65340 65377 65380))
+(xsdre-def-primitive-category 'Zs
+			      '(32 160 5760
+				   (8192 . 8203)
+				   8239 12288))
+(xsdre-def-primitive-category 'Zl
+			      '(8232))
+(xsdre-def-primitive-category 'Zp
+			      '(8233))
+(xsdre-def-primitive-category 'Sm
+			      '(43
+				(60 . 62)
+				124 126 172 177 215 247 8260
+				(8314 . 8316)
+				(8330 . 8332)
+				(8592 . 8596)
+				(8602 . 8603)
+				8608 8611 8614 8622
+				(8654 . 8655)
+				8658 8660
+				(8704 . 8945)
+				(8968 . 8971)
+				(8992 . 8993)
+				9655 9665 9839 64297 65122
+				(65124 . 65126)
+				65291
+				(65308 . 65310)
+				65372 65374 65506
+				(65513 . 65516)
+				120513 120539 120571 120597 120629 120655
+				120687 120713 120745 120771))
+(xsdre-def-primitive-category 'Sc
+			      '(36
+				(162 . 165)
+				(2546 . 2547)
+				3647 6107
+				(8352 . 8367)
+				65129 65284
+				(65504 . 65505)
+				(65509 . 65510)))
+(xsdre-def-primitive-category 'Sk
+			      '(94 96 168 175 180 184
+				   (697 . 698)
+				   (706 . 719)
+				   (722 . 735)
+				   (741 . 749)
+				   (884 . 885)
+				   (900 . 901)
+				   8125
+				   (8127 . 8129)
+				   (8141 . 8143)
+				   (8157 . 8159)
+				   (8173 . 8175)
+				   (8189 . 8190)
+				   (12443 . 12444)
+				   65342 65344 65507))
+(xsdre-def-primitive-category 'So
+			      '((166 . 167)
+				169 174 176 182 1154 1769
+				(1789 . 1790)
+				2554 2928
+				(3841 . 3843)
+				(3859 . 3863)
+				(3866 . 3871)
+				3892 3894 3896
+				(4030 . 4037)
+				(4039 . 4044)
+				4047
+				(8448 . 8449)
+				(8451 . 8454)
+				(8456 . 8457)
+				8468
+				(8470 . 8472)
+				(8478 . 8483)
+				8485 8487 8489 8494 8498 8506
+				(8597 . 8601)
+				(8604 . 8607)
+				(8609 . 8610)
+				(8612 . 8613)
+				(8615 . 8621)
+				(8623 . 8653)
+				(8656 . 8657)
+				8659
+				(8661 . 8691)
+				(8960 . 8967)
+				(8972 . 8991)
+				(8994 . 9000)
+				(9003 . 9083)
+				(9085 . 9114)
+				(9216 . 9254)
+				(9280 . 9290)
+				(9372 . 9449)
+				(9472 . 9621)
+				(9632 . 9654)
+				(9656 . 9664)
+				(9666 . 9719)
+				(9728 . 9747)
+				(9753 . 9838)
+				(9840 . 9841)
+				(9985 . 9988)
+				(9990 . 9993)
+				(9996 . 10023)
+				(10025 . 10059)
+				10061
+				(10063 . 10066)
+				10070
+				(10072 . 10078)
+				(10081 . 10087)
+				10132
+				(10136 . 10159)
+				(10161 . 10174)
+				(10240 . 10495)
+				(11904 . 11929)
+				(11931 . 12019)
+				(12032 . 12245)
+				(12272 . 12283)
+				12292
+				(12306 . 12307)
+				12320
+				(12342 . 12343)
+				(12350 . 12351)
+				(12688 . 12689)
+				(12694 . 12703)
+				(12800 . 12828)
+				(12842 . 12867)
+				(12896 . 12923)
+				12927
+				(12938 . 12976)
+				(12992 . 13003)
+				(13008 . 13054)
+				(13056 . 13174)
+				(13179 . 13277)
+				(13280 . 13310)
+				(42128 . 42145)
+				(42148 . 42163)
+				(42165 . 42176)
+				(42178 . 42180)
+				42182 65508 65512
+				(65517 . 65518)
+				(65532 . 65533)
+				(118784 . 119029)
+				(119040 . 119078)
+				(119082 . 119140)
+				(119146 . 119148)
+				(119171 . 119172)
+				(119180 . 119209)
+				(119214 . 119261)))
+(xsdre-def-primitive-category 'Cc
+			      '((0 . 31)
+				(127 . 159)))
+(xsdre-def-primitive-category 'Cf
+			      '(1807
+				(6155 . 6158)
+				(8204 . 8207)
+				(8234 . 8238)
+				(8298 . 8303)
+				65279
+				(65529 . 65531)
+				(119155 . 119162)
+				917505
+				(917536 . 917631)))
+(xsdre-def-primitive-category 'Co
+			      '((57344 . 63743)
+				(983040 . 1048573)
+				(1048576 . 1114109)))
+
+(provide 'xsd-regexp)
+
+;;; xsd-regexp.el ends here