annotate lisp/mule/mule-trex.el @ 164:4e0740e5aab2

Added tag r20-3b8 for changeset 0132846995bd
author cvs
date Mon, 13 Aug 2007 09:43:39 +0200
parents 131b0175ea99
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
70
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1 ;; TREX: Tools for Regluar EXpressions
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2 ;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3 ;; Regular Expression Compiler
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
4 ;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
5 ;; Coded by S.Tomura <tomura@etl.go.jp>
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
6
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
7 ;; Copyright (C) 1992 Free Software Foundation, Inc.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
8
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
9 ;; This file is part of XEmacs.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
10 ;; This file contains Japanese characters
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
11
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
12 ;; XEmacs is free software; you can redistribute it and/or modify it
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
13 ;; under the terms of the GNU General Public License as published by
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
14 ;; the Free Software Foundation; either version 2, or (at your option)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
15 ;; any later version.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
16
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
17 ;; XEmacs is distributed in the hope that it will be useful, but
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
18 ;; WITHOUT ANY WARRANTY; without even the implied warranty of
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
19 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
20 ;; General Public License for more details.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
21
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
22 ;; You should have received a copy of the GNU General Public License
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
23 ;; along with XEmacs; see the file COPYING. If not, write to the
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
24 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
25 ;; Boston, MA 02111-1307, USA.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
26
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
27 (defvar TREX-version "0.41")
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
28 ;;; Last modified date: Thu Jun 15 13:07:39 1995
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
29
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
30 ;;; 95.6.15 modified by S.Tomura <tomura@etl.go.jp>
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
31 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
32 ;;; $BFbB"$N(Bre_compile_pattern $B$HF1MM$K(B case-fold-search $B$K$h$C$F!"(B
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
33 ;;; translate $B$9$k$h$&$KJQ99$7$?!#(B
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
34 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
35 ;;; 95.6.14 modified by S.Tomura <tomura@etl.go.jp>
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
36 ;;; print-translate $B$rDI2C!#(B<0.38>
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
37 ;;; print-fastmap $B$rDI2C!#(B
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
38 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
39 ;;; start_memory, end_memory $B$NBh(B2$B0z?t$r@8@.$9$k$?$a$K!"(B:mark $B$NFbIt9=(B
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
40 ;;; $BB$$rJQ99$7$?!#(B
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
41 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
42 ;;; re-compile-and-dump, regexp-compile-and-dump $B$rDI2C!#(B
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
43 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
44 ;;; 95.6.13
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
45 ;;; regexp19.c $B$KBP1~$7$F(B start_memory, end_memory $B$N(B dump $B%k!<%A%s$r=$@5(B
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
46 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
47 ;;; $B$9$Y$-$3$H!'(B
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
48 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
49 ;;; (1) \(\)*
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
50 ;;; (2) $B;^$N=gHV(B
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
51 ;;; (3) $B0UL#$N$J$$%0%k!<%W;2>H$N8!=P(B "\(a\\)\\2"$B$J$I(B
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
52
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
53 (defmacro TREX-inc (symbol &optional delta)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
54 (list 'setq symbol (if delta (list '+ symbol delta)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
55 (list '1+ symbol))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
56
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
57 (defmacro TREX-dec (symbol &optional delta)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
58 (list 'setq symbol (if delta (list '- symbol delta)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
59 (list '1- symbol))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
60
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
61 (defmacro num (sym)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
62 (list 'num* (list 'quote sym)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
63
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
64 (defun num* (sym)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
65 (TREX-read-hexa (substring (symbol-name sym) 2)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
66
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
67 (defun TREX-read-hexa (str)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
68 (let ((result 0) (i 0) (max (length str)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
69 (while (< i max)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
70 (let ((ch (aref str i)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
71 (cond((and (<= ?0 ch) (<= ch ?9))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
72 (setq result (+ (* result 16) (- ch ?0))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
73 ((and (<= ?a ch) (<= ch ?f))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
74 (setq result (+ (* result 16) (+ (- ch ?a) 10))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
75 ((and (<= ?A ch) (<= ch ?F))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
76 (setq result (+ (* result 16) (+ (- ch ?A) 10)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
77 (TREX-inc i)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
78 result))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
79
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
80 ;;; 1 bytes : 0x00 <= C11 <= 0x7F
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
81 ;;; n bytes : 0x80 == LCCMP
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
82 ;;; 2 bytes 0xA0 <= LC <= 0xAF
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
83 ;;; 3 bytes 0xB0 <= LC <= 0xBB
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
84 ;;; 4 bytes 0xBC <= LC <= 0xBE
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
85 ;;; 2 bytes : 0x81 <= LC <= 0x8F
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
86 ;;; 3 bytes : 0x90 <= LC <= 0x9B
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
87 ;;; 4 bytes : 0x9C <= LC <= 0x9E
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
88
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
89
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
90 (defun TREX-char-octets (str index)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
91 (let ((max (length str)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
92 (if (or (< index 0) (<= max index)) 0
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
93 (let ((ch (aref str index))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
94 (bytes))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
95 (setq bytes
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
96 (cond ((<= ch (num 0x7f)) 1)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
97 ((= ch (num 0x80))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
98 (let ((max (length str))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
99 (i index))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
100 (while (and (< i max)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
101 (<= (num 0xa0) (aref str i))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
102 (<= (aref str i) (num 0xbe)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
103 (setq ch (aref str i))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
104 (cond ((<= ch (num 0xaf)) (TREX-inc i 2))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
105 ((<= ch (num 0xbb)) (TREX-inc i 3))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
106 ((<= ch (num 0xbe)) (TREX-inc i 4))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
107 (- i index)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
108 ((<= ch (num 0x8f)) 2)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
109 ((<= ch (num 0x9b)) 3)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
110 ((<= ch (num 0x9e)) 4)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
111 (t 1)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
112 (if (<= (+ index bytes) max) bytes 1)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
113
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
114 (defun TREX-comp-charp (str index)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
115 (= (aref str index) (num 0x80)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
116
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
117 ;;; 0x00 <= C11 <= 0x7F : 1 bytes
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
118 ;;; Type 1-1 C11
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
119 ;;; 0x80 == LCCMP : n bytes
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
120 ;;; Type N LCCMP LCN1 C11 ... LCN2 C21 ... LCNn Cn1 ...
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
121 ;;; 0xA0 <= LCN* <= 0xBE
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
122 ;;; LCN* = LC + 0x20
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
123 ;;; LCN* = 0xA0 (ASCII)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
124 ;;; 0x81 <= LC1 <= 0x8F : 2 bytes
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
125 ;;; Type 1-2 LC1 C11 :
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
126 ;;; 0xA0 <= C11 <= 0xFF
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
127 ;;; 0x90 <= LC2 <= 0x99 : 3 bytes
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
128 ;;; Type 2-3 LC2 C21 C22
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
129 ;;; 0xA0 <= C21 <= 0xFF
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
130 ;;; 0xA0 <= C22 <= 0xFF
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
131 ;;; 0x9A == LCPRV1 : 3 bytes
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
132 ;;; Type 1-3 LCPRV1 LC12 C11
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
133 ;;; 0xA0 <= LC12 <= 0xB7
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
134 ;;; 0xA0 <= C11 <= 0xFF
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
135 ;;; 0x9B == LCPRV1 : 3 bytes
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
136 ;;; Type 1-3 LCPRV1 LC12 C11
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
137 ;;; 0xB8 <= LC12 <= 0xBF
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
138 ;;; 0xA0 <= C11 <= 0xFF
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
139 ;;; 0x9C == LCPRV2 : 4 bytes
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
140 ;;; Type 2-4 LCPRV2 LC22 C21 C22
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
141 ;;; 0xC0 <= LC22 <= 0xC7
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
142 ;;; 0xA0 <= C21 <= 0xFF
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
143 ;;; 0xA0 <= C22 <= 0xFF
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
144 ;;; 0x9D == LCPRV2 : 4 bytes
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
145 ;;; Type 2-4 LCPRV2 LC22 C21 C22
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
146 ;;; 0xC8 <= LC22 <= 0xDF
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
147 ;;; 0xA0 <= C21 <= 0xFF
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
148 ;;; 0xA0 <= C22 <= 0xFF
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
149 ;;; 0x9E == LCPRV3 : 4 bytes
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
150 ;;; Type 3-4 LCPRV3 C31 C32 C33
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
151 ;;; 0xA0 <= C31 <= 0xBF
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
152 ;;; 0xA0 <= C32 <= 0xFF
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
153 ;;; 0xA0 <= C33 <= 0xFF
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
154 ;;; char = [0x00-0x7f]\|
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
155 ;;; 0x80
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
156 ;;; \(0xa0[0xa0-0xff]\|
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
157 ;;; [0xa1-0xaf][0xa0-0xff]\|
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
158 ;;; [0xb0-0xb9][0xa0-0xff][0xa0-0xff]\|
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
159 ;;; 0xba[0xa0-0xb7][0xa0-0xff]\|
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
160 ;;; 0xbb[0xb8-0xbf][0xa0-0xff]\|
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
161 ;;; 0xbc[0xc0-0xc7][0xa0-0xff][0xa0-0xff]\|
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
162 ;;; 0xbd[0xc8-0xdf][0xa0-0xff][0xa0-0xff]\|
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
163 ;;; 0xbe[0xa0-0xbf][0xa0-0xff][0xa0-0xff]
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
164 ;;; \)*\|
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
165 ;;; [0x81-0x8f][0xa0-0xff]\|
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
166 ;;; [0x90-0x99][0xa0-0xff][0xa0-0xff]\|
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
167 ;;; 0x9a[0xa0-0xb7][0xa0-0xff]\|
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
168 ;;; 0x9b[0xb8-0xbf][0xa0-0xff]\|
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
169 ;;; 0x9c[0xc0-0xc7][0xa0-0xff][0xa0-0xff]\|
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
170 ;;; 0x9d[0xc8-0xdf][0xa0-0xff][0xa0-0xff]\|
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
171 ;;; 0x9e[0xa0-0xbf][0xa0-0xff][0xa0-0xff]
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
172
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
173 (defun regexp-make-or (&rest body)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
174 (cons ':or body))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
175
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
176 (defun regexp-make-seq (&rest body)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
177 (cons ':seq body))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
178
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
179 (defun regexp-make-star (regexp)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
180 (list ':star regexp))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
181
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
182 (defun regexp-make-range (from to)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
183 (list 'CHARSET (list ':range from to)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
184
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
185
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
186 (defvar regexp-allchar-regexp
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
187 (regexp-make-or
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
188 (regexp-make-range 0 (num 0x7f))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
189 (regexp-make-seq
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
190 (num 0x80)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
191 (regexp-make-star
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
192 (regexp-make-or
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
193 (regexp-make-seq
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
194 (num 0xa0)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
195 (regexp-make-range (num 0xa0) (num 0xff)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
196 (regexp-make-seq
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
197 (regexp-make-range (num 0xa1) (num 0xaf))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
198 (regexp-make-range (num 0xa0) (num 0xff)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
199 (regexp-make-seq
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
200 (regexp-make-range (num 0xb0) (num 0xb9))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
201 (regexp-make-range (num 0xa0) (num 0xff))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
202 (regexp-make-range (num 0xa0) (num 0xff)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
203 (regexp-make-seq
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
204 (num 0xba)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
205 (regexp-make-range (num 0xa0) (num 0xb7))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
206 (regexp-make-range (num 0xa0) (num 0xff)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
207 (regexp-make-seq
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
208 (num 0xbb)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
209 (regexp-make-range (num 0xb8) (num 0xbf))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
210 (regexp-make-range (num 0xa0) (num 0xff)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
211 (regexp-make-seq
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
212 (num 0xbc)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
213 (regexp-make-range (num 0xc0) (num 0xc7))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
214 (regexp-make-range (num 0xa0) (num 0xff))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
215 (regexp-make-range (num 0xa0) (num 0xff)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
216 (regexp-make-seq
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
217 (num 0xbd)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
218 (regexp-make-range (num 0xc8) (num 0xdf))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
219 (regexp-make-range (num 0xa0) (num 0xff))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
220 (regexp-make-range (num 0xa0) (num 0xff)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
221 (regexp-make-seq
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
222 (num 0xbe)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
223 (regexp-make-range (num 0xa0) (num 0xbf))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
224 (regexp-make-range (num 0xa0) (num 0xff))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
225 (regexp-make-range (num 0xa0) (num 0xff))))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
226 (regexp-make-seq
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
227 (regexp-make-range (num 0x81) (num 0x8f))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
228 (regexp-make-range (num 0xa0) (num 0xff)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
229 (regexp-make-seq
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
230 (regexp-make-range (num 0x90) (num 0x99))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
231 (regexp-make-range (num 0xa0) (num 0xff))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
232 (regexp-make-range (num 0xa0) (num 0xff)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
233 (regexp-make-seq
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
234 (num 0x9a)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
235 (regexp-make-range (num 0xa0) (num 0xb7))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
236 (regexp-make-range (num 0xa0) (num 0xff)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
237 (regexp-make-seq
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
238 (num 0x9b)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
239 (regexp-make-range (num 0xb8) (num 0xbf))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
240 (regexp-make-range (num 0xa0) (num 0xff)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
241 (regexp-make-seq
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
242 (num 0x9c)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
243 (regexp-make-range (num 0xc0) (num 0xc7))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
244 (regexp-make-range (num 0xa0) (num 0xff))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
245 (regexp-make-range (num 0xa0) (num 0xff)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
246 (regexp-make-seq
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
247 (num 0x9d)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
248 (regexp-make-range (num 0xc8) (num 0xdf))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
249 (regexp-make-range (num 0xa0) (num 0xff))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
250 (regexp-make-range (num 0xa0) (num 0xff)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
251 (regexp-make-seq
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
252 (num 0x9e)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
253 (regexp-make-range (num 0xa0) (num 0xbf))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
254 (regexp-make-range (num 0xa0) (num 0xff))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
255 (regexp-make-range (num 0xa0) (num 0xff)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
256
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
257 ;;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
258 ;;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
259 ;;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
260
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
261 (defun TREX-string-reverse (str)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
262 (if (<= (length str) 1) str
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
263 (let ((result (make-string (length str) 0))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
264 (i 0)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
265 (j (1- (length str))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
266 (while (<= 0 j)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
267 (aset result i (aref str j))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
268 (TREX-inc i)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
269 (TREX-dec j))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
270 result)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
271
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
272 (defun TREX-string-forward-anychar (str start)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
273 (and (stringp str) (numberp start)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
274 (let ((max (length str)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
275 (and (<= 0 start)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
276 (< start max)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
277 (+ start (TREX-char-octets str start))))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
278
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
279 (defmacro TREX-init (symbol value)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
280 (` (if (null (, symbol))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
281 (setq (, symbol) (, value)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
282
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
283 (defmacro TREX-push (val symbol)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
284 (list 'setq symbol (list 'cons val symbol)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
285
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
286 (defun TREX-member (elm list pred)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
287 (while (and list (not (funcall pred elm (car list))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
288 (setq list (cdr list)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
289 list)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
290
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
291 (defun TREX-memequal (elm list)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
292 (while (and list (not (equal elm (car list))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
293 (setq list (cdr list)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
294 list)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
295
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
296 (defun TREX-find (elm list)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
297 (let ((pos 0))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
298 (while (and list (not (equal elm (car list))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
299 (setq list (cdr list))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
300 (TREX-inc pos))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
301 (if list pos
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
302 nil)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
303
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
304 (defun TREX-find-if (pred list)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
305 (let ((pos 0))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
306 (while (and list (not (funcall pred (car list))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
307 (TREX-inc pos)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
308 (setq list (cdr list)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
309 (if list pos
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
310 nil)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
311
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
312 (defun TREX-firstn (list n)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
313 (if (or (<= n 0) (null list)) nil
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
314 (cons (car list) (TREX-firstn (cdr list) (1- n)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
315
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
316 (defun TREX-delete-duplicate (list)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
317 (let ((result nil))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
318 (while list
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
319 (let ((elm (car list)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
320 (if (not (TREX-memequal elm result))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
321 (TREX-push elm result)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
322 (setq list (cdr list)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
323 (nreverse result)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
324
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
325 (defun TREX-delete (elm list)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
326 (let ((result nil))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
327 (while list
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
328 (if (not (equal elm (car list)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
329 (TREX-push (car list) result))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
330 (setq list (cdr list)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
331 (nreverse result)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
332
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
333 (defun TREX-string-to-list (str)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
334 (let ((result nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
335 (i 0)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
336 (max (length str)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
337 (while (< i max)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
338 (TREX-push (aref str i) result)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
339 (TREX-inc i))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
340 (nreverse result)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
341
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
342 (defun TREX-sort (list lessp &optional key)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
343 (if (null key)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
344 (sort list lessp)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
345 (sort list (function (lambda (x y) (funcall lessp (funcall key x) (funcall key y)))))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
346
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
347 (defun TREX-key-lessp (x y)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
348 (cond((symbolp x)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
349 (cond ((symbolp y)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
350 (string-lessp x y))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
351 (t;; (not (symbolp))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
352 t)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
353 ((numberp x)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
354 (cond ((numberp y)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
355 (< x y))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
356 ((and (consp y) (eq (car y) ':range))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
357 (< x (nth 1 y)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
358 (t nil)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
359 ((and (consp x) (eq (car x) ':range))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
360 (cond ((and (consp y) (eq (car y) ':range))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
361 (< (nth 2 x) (nth 1 y)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
362 ((numberp y)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
363 (< (nth 2 x) y))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
364 (t nil)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
365 (t nil)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
366
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
367 (defun TREX-lessp-car (x y)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
368 (let ((x (car x))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
369 (y (car y)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
370 (TREX-key-lessp x y)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
371
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
372 (defmacro TREX-define-enum (&rest list)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
373 (list 'TREX-define-enum* (list 'quote list)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
374
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
375 (defun TREX-define-enum* (list)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
376 (let ((i 0))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
377 (while list
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
378 (set (car list) i)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
379 (TREX-inc i)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
380 (setq list (cdr list)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
381
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
382 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
383 ;;; regexp-parse
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
384 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
385
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
386 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
387 ;;; $B@55,I=8=(B(regular expression)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
388 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
389 ;;; . single character except a newline
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
390 ;;; REG* more than zero
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
391 ;;; REG+ at least once
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
392 ;;; REG? once or not at all
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
393 ;;; [...] character set
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
394 ;;; [^...] character not set
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
395 ;;; ^ beginning of line
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
396 ;;; $ end of line
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
397 ;;; \ quote
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
398 ;;; \| alternative
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
399 ;;; \( ... \) group and mark
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
400 ;;; \DIGIT
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
401 ;;; \` beginning of buffer
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
402 ;;; \' end of buffer
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
403 ;;; \b beginning of word or end of word
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
404 ;;; \B not \b
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
405 ;;; \< beginning of word
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
406 ;;; \> end of word
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
407 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
408 ;;; \w word-constituent character
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
409 ;;; \W not \w
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
410 ;;; \sCODE syntax CODE character
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
411 ;;; \SCODE not \sCODE
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
412
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
413 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
414 ;;; REG0 ::= REG1 |
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
415 ;;; REG1 "\\|" REG0
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
416 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
417 ;;; REG1 ::= REG2 |
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
418 ;;; REG2 REG1
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
419 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
420 ;;; REG2 ::= REG3 |
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
421 ;;; REG2 "*" |
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
422 ;;; REG2 "+" |
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
423 ;;; REG2 "?" |
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
424 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
425 ;;; REG3 ::= "." |
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
426 ;;; "[" ... "]" |
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
427 ;;; "[" "^" ... "]" |
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
428 ;;; "^" |
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
429 ;;; "$" |
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
430 ;;; "\\" DIGIT |
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
431 ;;; "\\(" REG0 "\\)"
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
432
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
433 ;;; $B>H9g$O@55,I=8=$N:8$+$i1&$X9T$o$l$k!%(B
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
434
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
435 (defvar *regexp-parse-translate* nil
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
436 "$B@55,I=8=$rFI$_9~$_Cf$K;HMQ$9$k(B translate table.\n
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
437 case-fold-search $B$NCM$K$h$C$F(B downcasetable $B$r@_Dj$9$k!#(B")
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
438
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
439 (defun regexp-parse-translate-char-string (str)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
440 (if (and *regexp-parse-translate*
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
441 (= (length str) 1))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
442 ;;; $BK\Ev$O(B destructive $B$G$b(B OK
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
443 (char-to-string (aref *regexp-parse-translate* (aref str 0)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
444 str))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
445
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
446 (defvar *regexp-word-definition* nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
447
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
448 (defvar *regexp-parse-index* nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
449 (defvar *regexp-parse-end* nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
450 (defvar *regexp-parse-str* nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
451 (defvar *regexp-parse-regno* 1)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
452
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
453 (defun regexp-error (&optional reason)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
454 (if (null reason) (setq reason "Bad regexp"))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
455 (error "Regexp-parse::%s \"%s\" * \"%s\"" reason (substring *regexp-parse-str* 0 *regexp-parse-index*)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
456 (substring *regexp-parse-str* *regexp-parse-index*)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
457
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
458 (defun word-parse (pattern)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
459 (let ((*regexp-word-definition* t))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
460 (regexp-parse pattern)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
461
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
462 (defun regexp-parse (pattern)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
463 (let*((*regexp-parse-str* pattern)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
464 (*regexp-parse-index* 0)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
465 (*regexp-parse-end* (length pattern))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
466 (*regexp-parse-regno* 1)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
467 (result (regexp-parse-0)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
468 (if (<= *regexp-parse-end* *regexp-parse-index*)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
469 result
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
470 (regexp-error))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
471
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
472 (defun regexp-parse-0 ()
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
473 (let* ((result (regexp-parse-1)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
474 (cond((<= *regexp-parse-end* *regexp-parse-index*)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
475 result)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
476 ((and (< (1+ *regexp-parse-index*) *regexp-parse-end*)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
477 (= (aref *regexp-parse-str* *regexp-parse-index*) ?\\)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
478 (= (aref *regexp-parse-str* (1+ *regexp-parse-index*)) ?|))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
479 (TREX-inc *regexp-parse-index* 2)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
480 (list ':or result (regexp-parse-0)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
481 (t result))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
482
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
483 (defun regexp-parse-1 ()
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
484 (let ((results nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
485 (result2 nil))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
486 (while (setq result2 (regexp-parse-2))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
487 (TREX-push result2 results))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
488 (if results
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
489 (if (cdr results)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
490 (cons ':seq (nreverse results))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
491 (car results))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
492 nil)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
493
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
494 (defun regexp-parse-2 ()
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
495 (let ((result (regexp-parse-3)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
496 (while (and (< *regexp-parse-index* *regexp-parse-end*)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
497 (TREX-memequal (aref *regexp-parse-str* *regexp-parse-index*)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
498 '(?* ?+ ??)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
499 (let ((ch (aref *regexp-parse-str* *regexp-parse-index*)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
500 (TREX-inc *regexp-parse-index*)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
501 (setq result
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
502 (cond((= ch ?*) (list ':star result))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
503 ((= ch ?+) (list ':plus result))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
504 ((= ch ??) (list ':optional result))))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
505 result))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
506
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
507 (defun regexp-parse-3 ()
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
508 (if (<= *regexp-parse-end* *regexp-parse-index*)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
509 nil
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
510 (let* ((start *regexp-parse-index*)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
511 (i *regexp-parse-index*)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
512 (end *regexp-parse-end*)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
513 (ch (aref *regexp-parse-str* i)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
514 (TREX-inc *regexp-parse-index*)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
515 (cond ((= ch ?.) '(ANYCHAR))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
516 ((= ch ?^) '(BEGLINE))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
517 ((= ch ?$) '(ENDLINE))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
518 ((= ch ?\[)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
519 (regexp-parse-charset))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
520 ((= ch ?\])
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
521 (setq *regexp-parse-index* start)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
522 nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
523 ((= ch ?*)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
524 (setq *regexp-parse-index* start)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
525 nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
526 ((= ch ?+)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
527 (setq *regexp-parse-index* start)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
528 nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
529 ((= ch ??)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
530 (setq *regexp-parse-index* start)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
531 nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
532 ((and (= ch ?\\) (< (1+ i) end))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
533 (setq ch (aref *regexp-parse-str* (1+ i)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
534 (TREX-inc i)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
535 (TREX-inc *regexp-parse-index*)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
536 (cond ((= ch ?| )
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
537 (setq *regexp-parse-index* start)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
538 nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
539 ((= ch ?\( )
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
540 (if (< 9 *regexp-parse-regno*)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
541 (regexp-error "Too many parenth"))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
542 (let ((regexp-parse-regno *regexp-parse-regno*))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
543 (TREX-inc *regexp-parse-regno*)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
544 (let ((result (regexp-parse-0)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
545
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
546 (cond((and (< (1+ *regexp-parse-index*) *regexp-parse-end*)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
547 (= (aref *regexp-parse-str* *regexp-parse-index*) ?\\ )
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
548 (= (aref *regexp-parse-str* (1+ *regexp-parse-index*)) ?\) ))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
549 (TREX-inc *regexp-parse-index* 2)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
550 (if *regexp-word-definition*
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
551 result
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
552 (list ':mark regexp-parse-regno
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
553 (- *regexp-parse-regno* regexp-parse-regno 1)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
554 result)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
555 (t
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
556 (regexp-error))))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
557 ((= ch ?\) )
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
558 (setq *regexp-parse-index* start)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
559 nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
560 ((= ch ?` ) '(BEGBUF))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
561 ((= ch ?' ) '(ENDBUF))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
562 ((= ch ?b )
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
563 (if *regexp-word-definition* (regexp-error) '(WORDBOUND)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
564 ((= ch ?B )
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
565 (if *regexp-word-definition* (regexp-error) '(NOTWORDBOUND)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
566 ((= ch ?< )
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
567 (if *regexp-word-definition* (regexp-error) '(WORDBEG)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
568 ((= ch ?> )
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
569 (if *regexp-word-definition* (regexp-error) '(WORDEND)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
570 ((= ch ?w ) (list 'SYNTAXSPEC
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
571 (syntax-spec-code ?w))) ;;;WORDCHAR
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
572 ((= ch ?W ) (list 'NOTSYNTAXSPEC
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
573 (syntax-spec-code ?w))) ;;;NOTWORDCHAR
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
574 ;;; ((= ch ?=) 'AT_DOT)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
575 ((and (<= ?1 ch)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
576 (<= ch ?9))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
577 (if *regexp-word-definition*
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
578 (regexp-error) (list 'DUPLICATE (- ch ?0))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
579 ((= ch ?0)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
580 (regexp-error))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
581 ((and (= ch ?s )
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
582 (< (1+ i) end))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
583 (TREX-inc *regexp-parse-index*)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
584 (list 'SYNTAXSPEC (syntax-spec-code (aref *regexp-parse-str* (1+ i)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
585 ((and (= ch ?S )
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
586 (< (1+ i) end))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
587 (TREX-inc *regexp-parse-index*)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
588 (list 'NOTSYNTAXSPEC (syntax-spec-code (aref *regexp-parse-str* (1+ i)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
589 ((and (= ch ?c )
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
590 (< (1+ i) end))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
591 (TREX-inc *regexp-parse-index*)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
592 (list 'CATEGORYSPEC (aref *regexp-parse-str* (1+ i))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
593 ((and (= ch ?C )
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
594 (< (1+ i) end))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
595 (TREX-inc *regexp-parse-index*)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
596 (list 'NOTCATEGORYSPEC (aref *regexp-parse-str* (1+ i))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
597 (t
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
598 (regexp-parse-translate-char-string
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
599 (substring *regexp-parse-str* (1+ i) (+ i 2))))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
600 (t
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
601 (let ((nextpos (TREX-string-forward-anychar *regexp-parse-str* i)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
602 (cond(nextpos
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
603 (setq *regexp-parse-index* nextpos)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
604 (regexp-parse-translate-char-string
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
605 (substring *regexp-parse-str* i nextpos)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
606 (t (regexp-error)))))))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
607
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
608 (defun regexp-parse-charset ()
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
609 (if (< *regexp-parse-index* *regexp-parse-end*)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
610 (cond((eq (aref *regexp-parse-str* *regexp-parse-index*) ?^)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
611 (TREX-inc *regexp-parse-index*)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
612 (regexp-parse-charset0 'CHARSET_NOT nil))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
613 (t (regexp-parse-charset0 'CHARSET ;; ':or
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
614 nil)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
615 (regexp-error)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
616
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
617 (defun regexp-parse-charset0 (op list)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
618 (if (< *regexp-parse-index* *regexp-parse-end*)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
619 (cond ((eq (aref *regexp-parse-str* *regexp-parse-index*) ?\])
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
620 (TREX-inc *regexp-parse-index*)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
621 (regexp-parse-charset1 op '("\]")))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
622 (t
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
623 (regexp-parse-charset1 op nil)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
624 (regexp-error)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
625
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
626 (defun regexp-parse-charset1 (op list)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
627 (if (< *regexp-parse-index* *regexp-parse-end*)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
628 (let* ((pos0 *regexp-parse-index*)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
629 (pos1 (TREX-string-forward-anychar *regexp-parse-str* pos0))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
630 (pos2 (TREX-string-forward-anychar *regexp-parse-str* pos1))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
631 (pos3 (TREX-string-forward-anychar *regexp-parse-str* pos2)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
632 (if pos0
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
633 ;;; ]
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
634 (cond((eq (aref *regexp-parse-str* pos0) ?\])
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
635 (setq *regexp-parse-index* pos1)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
636 ;;; returns charset form
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
637 (cons op (sort (nreverse list) 'TREX-charset-lessp)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
638 ;;; [^]] - [^]]
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
639 ((and pos1 pos2 pos3
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
640 (eq (aref *regexp-parse-str* pos1) ?-)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
641 (not (eq (aref *regexp-parse-str* pos2) ?\])))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
642 (let ((from (substring *regexp-parse-str* pos0 pos1))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
643 (to (substring *regexp-parse-str* pos2 pos3)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
644 (if (and (= (length from) (length to))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
645 (not (TREX-comp-charp from 0))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
646 (not (TREX-comp-charp to 0))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
647 (or (= (length from) 1)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
648 (= (aref from 0) (aref to 0)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
649 (or (string-equal from to) ;;; by Enami 93.08.08
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
650 (string-lessp from to)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
651 (if (string-equal from to)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
652 (TREX-push from list)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
653 (TREX-push (list ':range from to) list))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
654 (regexp-error)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
655 (setq *regexp-parse-index* pos3)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
656 (regexp-parse-charset1 op list))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
657 ;;; [^]] - ] ;;; by Enami 93.08.08
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
658 ((and pos1 pos2
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
659 (eq (aref *regexp-parse-str* pos1) ?-)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
660 (eq (aref *regexp-parse-str* pos2) ?\]))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
661 (TREX-push (substring *regexp-parse-str* pos0 pos1) list)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
662 (TREX-push (substring *regexp-parse-str* pos1 pos2) list)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
663 (setq *regexp-parse-index* pos2)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
664 (regexp-parse-charset1 op list))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
665 (t
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
666 (TREX-push (substring *regexp-parse-str* pos0 pos1) list)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
667 (setq *regexp-parse-index* pos1)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
668 (regexp-parse-charset1 op list)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
669 (regexp-error)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
670 (regexp-error)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
671
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
672 (defun TREX-charset-lessp (ch1 ch2)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
673 (cond((and (stringp ch1) (stringp ch2))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
674 (string-lessp ch1 ch2))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
675 ((and (consp ch1) (consp ch2))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
676 (string-lessp (nth 2 ch1) (nth 1 ch2)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
677 ((consp ch1)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
678 (string-lessp (nth 2 ch1) ch2))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
679 ((consp ch2)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
680 (string-lessp ch1 (nth 1 ch2)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
681
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
682 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
683 ;;; define-regexp
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
684 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
685
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
686 (defmacro define-regexp (name &rest forms)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
687 (` (define-regexp* '(, name) '(, forms))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
688
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
689 (defun define-regexp* (name forms)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
690 (put name ':regexp-has-definition t)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
691 (put name ':regexp-definition
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
692 (if (= (length forms) 1)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
693 (nth 0 forms)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
694 (` (:seq (,@ forms))))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
695
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
696 (defun regexp-get-definition (name)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
697 (get name ':regexp-definition))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
698
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
699 (defun regexp-define-specials (names)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
700 (mapcar (function (lambda (name)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
701 (put name ':regexp-special t)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
702 names))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
703
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
704 (defun regexp-has-definition (name)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
705 (get name ':regexp-has-definition))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
706
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
707 (defun regexp-specialp (name)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
708 (get name ':regexp-special))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
709
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
710 (defun regexp-expand-definition (regexp &optional callers)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
711 (cond
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
712 ((consp regexp)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
713 (let ((op (car regexp)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
714 (cond((eq op ':mark)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
715 (` (:mark (, (nth 1 regexp))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
716 (, (nth 2 regexp))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
717 (, (regexp-expand-definition (nth 3 regexp))))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
718 ((eq op ':or)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
719 (` (:or (,@ (mapcar 'regexp-expand-definition (cdr regexp))))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
720 ((eq op ':seq)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
721 (` (:seq (,@ (mapcar 'regexp-expand-definition (cdr regexp))))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
722 ((eq op ':optional)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
723 (` (:optional (, (regexp-expand-definition (nth 1 regexp))))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
724 ((eq op ':star)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
725 (` (:star (, (regexp-expand-definition (nth 1 regexp))))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
726 ((eq op ':plus)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
727 (` (:plus (, (regexp-expand-definition (nth 1 regexp))))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
728 ;;;;****
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
729 ((eq op ':range)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
730 regexp)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
731 ((regexp-specialp op)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
732 regexp)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
733 ((memq op callers)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
734 (error "regexp defs(%s)" op))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
735 ((regexp-has-definition op)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
736 (regexp-expand-definition (regexp-get-definition op)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
737 (cons op callers)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
738 (t
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
739 (error "undefined regexp(%s)" op)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
740 ((stringp regexp)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
741 regexp)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
742 ((null regexp)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
743 regexp)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
744 (t
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
745 regexp)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
746
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
747 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
748 ;;; regexp-*-lessp
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
749 ;;; $B@55,7A<0$NA4=g=x$rDj5A$9$k!%(B
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
750 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
751
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
752 ;;; nil < number < string < symbol < cons
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
753
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
754 (defun regexp-lessp (exp1 exp2)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
755 (cond((equal exp1 exp2)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
756 nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
757 ((null exp1) t)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
758 ((numberp exp1)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
759 (cond((null exp2) nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
760 ((numberp exp2)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
761 (< exp1 exp2))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
762 (t t)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
763 ((stringp exp1)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
764 (cond((or (null exp2)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
765 (numberp exp2))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
766 nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
767 ((stringp exp2)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
768 (string< exp1 exp2))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
769 (t t)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
770 ((symbolp exp1)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
771 (cond((or (null exp2)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
772 (numberp exp2)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
773 (stringp exp2))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
774 nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
775 ((symbolp exp2)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
776 (string< exp1 exp2))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
777 (t t)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
778 ((consp exp1)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
779 (cond ((not (consp exp2))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
780 nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
781 ((< (length exp1) (length exp2))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
782 t)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
783 ((= (length exp1) (length exp2))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
784 (regexp-lessp-list exp1 exp2))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
785 (t nil)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
786
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
787 (defun regexp-lessp-list (exp1 exp2)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
788 (cond((null exp1) nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
789 ((regexp-lessp (car exp1) (car exp2))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
790 t)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
791 ((equal (car exp1) (car exp2))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
792 (regexp-lessp-list (cdr exp1) (cdr exp2)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
793 (t nil)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
794
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
795 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
796 ;;; item = list of seq-body(== list of regexp)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
797 ;;; nil < cons
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
798 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
799
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
800 (defun regexp-item-lessp (item1 item2)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
801 (cond((equal item1 item2)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
802 nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
803 ((null item2) t)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
804 ((consp item1)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
805 (cond((consp item2)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
806 (cond ((regexp-key-lessp (car item1) (car item2))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
807 t)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
808 ((equal (car item1) (car item2))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
809 (regexp-item-lessp (cdr item1) (cdr item2)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
810 (t nil)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
811 (t nil)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
812
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
813
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
814 (defun regexp-key-lessp-list (sym1 sym2 list)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
815 (< (TREX-find sym1 list) (TREX-find sym2 list)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
816
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
817 (defun regexp-key-lessp (key1 key2)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
818 (cond ((regexp-key-class0 key1)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
819 (cond((regexp-key-class0 key2)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
820 (regexp-key-lessp-list (car key1) (car key2) *regexp-key-class0*))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
821 (t t)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
822 ((regexp-key-class1 key1)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
823 (cond((regexp-key-class1 key2)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
824 (regexp-key-lessp-list key1 key2 *regexp-key-class1*))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
825 ((or (regexp-key-class2 key2)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
826 (regexp-key-class3 key2)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
827 (regexp-key-class4 key2)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
828 (null key2))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
829 t)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
830 ((regexp-key-class2 key1)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
831 (cond((regexp-key-class2 key2)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
832 (regexp-key-lessp-list key1 key2 *regexp-key-class2*))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
833 ((or (regexp-key-class3 key2)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
834 (regexp-key-class4 key2)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
835 (null key2))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
836 t)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
837 ((regexp-key-class3 key1)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
838 (cond((regexp-key-class3 key2)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
839 (regexp-key-lessp-list (car key1) (car key2) *regexp-key-class3*))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
840 ((or (regexp-key-class4 key2)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
841 (null key2))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
842 t)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
843 ((regexp-key-class4 key1)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
844 (or (null key2)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
845 (and (regexp-key-class4 key2) (< key1 key2))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
846 (t nil)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
847
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
848 (defun regexp-alist-lessp (pair1 pair2)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
849 (regexp-key-lessp (car pair1) (car pair2)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
850
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
851 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
852 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
853 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
854
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
855 (defvar *regexp-key-class0* '(START_MEMORY STOP_MEMORY))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
856
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
857 (defvar *regexp-key-class1* '(BEGLINE ENDLINE
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
858 ;;; BEFORE_DOT AT_DOT AFTER_DOT
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
859 BEGBUF ENDBUF
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
860 WORDBEG WORDEND
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
861 WORDBOUND NOTWORDBOUND))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
862
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
863 (defvar *regexp-key-class2* '(ANYCHAR
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
864 CHARSET
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
865 CHARSET_NOT
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
866 ;;;WORDCHAR NOTWORDCHAR
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
867 ))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
868
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
869 (defvar *regexp-key-class3* '(DUPLICATE
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
870 SYNTAXSPEC NOTSYNTAXSPEC
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
871 CATEGORYSPEC NOTCATEGORYSPEC
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
872 ))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
873
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
874 (regexp-define-specials *regexp-key-class0*)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
875 (regexp-define-specials *regexp-key-class1*)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
876 (regexp-define-specials *regexp-key-class2*)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
877 (regexp-define-specials *regexp-key-class3*)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
878
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
879 (defun regexp-key-class0 (key)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
880 (and (consp key) (TREX-memequal (car key) *regexp-key-class0*)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
881
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
882 (defun regexp-key-class1 (key)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
883 (and (consp key)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
884 (TREX-memequal (car key) *regexp-key-class1*)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
885
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
886 (defun regexp-key-class2 (key)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
887 (and (consp key) (TREX-memequal (car key) *regexp-key-class2*)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
888
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
889 (defun regexp-key-class3 (key)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
890 (and (consp key)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
891 (TREX-memequal (car key) *regexp-key-class3*)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
892
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
893 (defun regexp-key-class4 (key)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
894 (or (and (consp key) (eq (car key) ':range))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
895 (numberp key) (symbolp key)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
896
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
897 (defun regexp-item-key-class0 (item)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
898 (regexp-key-class0 (car item)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
899
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
900 (defun regexp-item-key-class1 (item)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
901 (regexp-key-class1 (car item)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
902
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
903 (defun regexp-item-key-class2 (item)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
904 (regexp-key-class2 (car item)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
905
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
906 (defun regexp-item-key-class3 (item)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
907 (regexp-key-class3 (car item)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
908
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
909 (defun regexp-item-key-class4 (item)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
910 (regexp-key-class4 (car item)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
911
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
912 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
913 ;;; regexp-sort
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
914 ;;; $B@55,I=8=$NI8=`7A<0$r5a$a$k$?$a$K@0Ns$r9T$&!%(B
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
915 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
916
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
917 (defvar *regexp-sort-flag* t)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
918 (defvar *regexp-debug* nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
919
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
920 (defun regexp-sort (list pred)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
921 (if *regexp-sort-flag*
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
922 (progn
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
923 (if *regexp-debug* (princ (format "(regexp-sort %s %s)\n" list pred)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
924 (let ((result (sort list pred)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
925 (if *regexp-debug* (princ (format "<== %s\n" result)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
926 result))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
927 list))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
928
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
929 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
930 ;;; regexp-inverse
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
931 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
932
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
933 (defun regexp-inverse (regexp)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
934 (if (consp regexp)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
935 (let ((op (car regexp)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
936 (cond((eq op ':mark)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
937 (list ':mark (nth 1 regexp) (nth 2 regexp)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
938 (regexp-inverse (nth 3 regexp))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
939 ((eq op 'DUPLICATE)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
940 regexp)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
941 ((eq op ':or)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
942 (cons ':or (mapcar 'regexp-inverse (cdr regexp))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
943 ((eq op ':seq)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
944 (cons ':seq (nreverse (mapcar 'regexp-inverse (cdr regexp)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
945 ((eq op ':optional)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
946 (list ':optional (regexp-inverse (nth 1 regexp))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
947 ((eq op ':star)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
948 (list ':star (regexp-inverse (nth 1 regexp))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
949 ((eq op ':plus)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
950 (list ':plus (regexp-inverse (nth 1 regexp))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
951 (t regexp)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
952 (if (stringp regexp)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
953 (TREX-string-reverse regexp)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
954 regexp)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
955
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
956 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
957 ;;; regexp-remove-infinite-loop
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
958 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
959
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
960 (defun regexp-remove-infinite-loop (regexp)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
961 (cond((consp regexp)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
962 (let ((op (car regexp)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
963 (cond((eq op ':mark)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
964 )
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
965 ((eq op 'DUPLICATE)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
966 regexp)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
967 ((eq op ':or)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
968 )
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
969 ((eq op ':seq)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
970 )
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
971 ((eq op ':optional)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
972 )
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
973 ((eq op ':star)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
974 )
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
975 ((eq op ':plus)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
976 )
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
977 (t regexp))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
978 ((stringp regexp)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
979 )
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
980 ((null regexp)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
981 )
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
982 (t
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
983 regexp)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
984
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
985
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
986 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
987 ;;; regexp-reform
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
988 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
989
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
990 (defvar *regexp-register-definitions* nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
991 (defvar *regexp-registers* nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
992
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
993 (defun regexp-reform-duplication (regexp)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
994 (let* ((*regexp-register-definitions* nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
995 (newregexp (regexp-reform-duplication-1 regexp)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
996 (let ((*regexp-registers* nil))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
997 (regexp-reform-duplication-2 newregexp))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
998
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
999 (defun regexp-reform-duplication-1 (regexp)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1000 (if (not (consp regexp)) regexp
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1001 (let ((mop (car regexp)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1002 (cond((eq mop ':or)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1003 (cons ':or (mapcar 'regexp-reform-duplication-1
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1004 (cdr regexp))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1005 ((eq mop ':seq)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1006 (cons ':seq (mapcar 'regexp-reform-duplication-1
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1007 (cdr regexp))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1008 ((TREX-memequal mop '(:star :plus :optional))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1009 (list mop (regexp-reform-duplication-1 (nth 1 regexp))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1010 ((eq mop ':mark)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1011 (TREX-push (cdr regexp)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1012 *regexp-register-definitions*)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1013 (list 'DUPLICATE (nth 1 regexp)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1014 (t regexp)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1015
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1016 (defun regexp-reform-duplication-2 (regexp)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1017 (if (not (consp regexp)) regexp
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1018 (let ((mop (car regexp)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1019 (cond((eq mop ':or)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1020 (let ((registers *regexp-registers*)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1021 (newregisters nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1022 (result nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1023 (or-body (cdr regexp)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1024 (while or-body
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1025 (setq *regexp-registers* registers)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1026 (TREX-push (regexp-reform-duplication-2 (car or-body)) result)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1027 (setq newregisters (TREX-delete-duplicate (append *regexp-registers* newregisters)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1028 (setq or-body (cdr or-body)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1029 (setq *regexp-registers* newregisters)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1030 (cons ':or (nreverse result))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1031 ((eq mop ':seq)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1032 (cons ':seq (mapcar 'regexp-reform-duplication-2
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1033 (cdr regexp))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1034 ((TREX-memequal mop '(:star :plus :optional))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1035 (list mop (regexp-reform-duplication-2 (nth 1 regexp))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1036 ((eq mop 'DUPLICATE)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1037 (let ((regno (nth 1 regexp)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1038 (if (TREX-memequal regno *regexp-registers*)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1039 regexp
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1040 (let ((def (assoc regno *regexp-register-definitions*)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1041 (TREX-push regno *regexp-registers*)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1042 ;;; $BBg>fIW!)(B
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1043 (if def
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1044 (cons ':mark def)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1045 regexp)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1046 (t regexp)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1047
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1048 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1049 ;;; regexp-expand
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1050 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1051
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1052 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1053 ;;; <ISLAND> ::= ( <ITEM> ...)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1054 ;;; <ITEM> ::= ( <SEQ-BODY> ... )
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1055 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1056
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1057 (defun regexp-expand-regexp (regexp)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1058 ;;; returns island
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1059 (if (consp regexp)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1060 (let ((mop (car regexp)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1061 (cond
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1062 ;;;((eq mop 'CHARSET)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1063 ;;; (regexp-expand-charset t (cdr regexp)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1064 ;;;((eq mop 'CHARSET_NOT)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1065 ;;; (regexp-expand-charset nil (cdr regexp)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1066 ((eq mop ':or)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1067 (regexp-expand-or (cdr regexp)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1068 ((eq mop ':seq)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1069 (regexp-expand-seq (cdr regexp)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1070 ((eq mop ':star)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1071 (let ((arg (nth 1 regexp)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1072 (if arg
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1073 (append (regexp-expand-seq (list arg regexp)) (list nil))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1074 (list nil))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1075 ((eq mop ':plus)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1076 (let ((arg (nth 1 regexp)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1077 (if arg
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1078 (regexp-expand-seq (list arg (list ':star arg)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1079 (list nil))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1080 ((eq mop ':optional)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1081 (append (regexp-expand-regexp (nth 1 regexp)) (list nil)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1082 ((eq mop ':mark)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1083 (let ((regno (nth 1 regexp))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1084 (groups (nth 2 regexp))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1085 (arg (nth 3 regexp)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1086 (if arg
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1087 (list (list (list 'START_MEMORY regno groups)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1088 arg
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1089 (list 'STOP_MEMORY regno groups)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1090 (list (list (list 'START_MEMORY regno groups)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1091 (list 'STOP_MEMORY regno groups))))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1092 (t (list (list regexp)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1093 (cond((null regexp) (list nil))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1094 ((symbolp regexp) (list (list regexp)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1095 ((numberp regexp) (list (list regexp)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1096 ((stringp regexp)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1097 (let ((result nil))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1098 (let ((i 0) (max (length regexp)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1099 (while (< i max)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1100 (TREX-push (aref regexp i) result)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1101 (TREX-inc i))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1102 (list (nreverse result)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1103 (t (list (list regexp))))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1104
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1105 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1106 ;;; (CHARSET "abc" ... ) == (:or (:seq "a" "b" "c") .... )
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1107 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1108 ;;; (:range "abc" "ade") == (:seq "a" (:range "bc" "de"))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1109 ;;; (:range "bc" "de" ) == (:or (:seq "b" (:range "c" 0xFF))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1110 ;;; (:seq (:range "b"+1 "d"-1) (:range 0xA0 0xFF))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1111 ;;; (:seq "d" (:range 0xA0 "e")))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1112 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1113
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1114 ;;; charset::
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1115
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1116 (defun charset-member-elt (ch elt)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1117 (if (consp elt)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1118 (if (eq (nth 0 elt) ':range)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1119 (and (<= ch (nth 1 elt))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1120 (<= (nth 2 elt) ch))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1121 nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1122 (equal ch elt)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1123
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1124 (defun charset-member-P (ch or-form)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1125 (let ((result) (l (cdr or-form)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1126 (while (and l (null result))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1127 (if (charset-membership-elt ch (car l))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1128 (setq result t))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1129 (setq l (cdr l)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1130 result))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1131
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1132 (defun charset-member-N (ch nor-form)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1133 (not (charset-member+ ch nor-form)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1134
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1135 (defun charset-norp (form)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1136 (and (consp form) (eq (car form) 'CHARSET_NOT)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1137
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1138 (defun charset-and (form1 form2)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1139 (if (charset-norp form1)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1140 (if (charset-norp form2)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1141 (cons ':or (charset-or-PP (cdr form1) (cdr form2)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1142 (charset-and-PN form2 form1))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1143 (if (charset-norp form2)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1144 (charset-and-pn form1 form2)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1145 (charset-and-PP form1 form2))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1146
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1147 (defun charset-or-PP (or-body1 or-body2)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1148 (append or-body1 or-body2))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1149
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1150
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1151
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1152
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1153 (defun regexp-charset-to-regexp (charsets)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1154 (cons ':or (mapcar 'regexp-charset-to-regexp* charsets)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1155
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1156 (defun regexp-charset-to-regexp* (elm)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1157 (cond((consp elm) (regexp-charset-range-to-regexp (nth 1 elm) (nth 2 elm)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1158 ((stringp elm) (cons ':seq (TREX-string-to-list elm)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1159 (t elm)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1160
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1161 (defun regexp-charset-range-to-regexp (str1 str2)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1162 (let ((result (regexp-charset-range-to-regexp* (TREX-string-to-list str1)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1163 (TREX-string-to-list str2))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1164 (if (= (length result) 1) (car result) (cons ':seq result))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1165
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1166
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1167 (defun regexp-charset-range-to-regexp* (nums1 nums2)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1168 (let ((len (length (cdr nums1)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1169 (ch1 (car nums1))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1170 (ch2 (car nums2)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1171 (if (= len 0)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1172 (if (= ch1 ch2) (list ch1)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1173 (list (regexp-charset-range-1 ch1 ch2)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1174 (if (= ch1 ch2)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1175 (cons ch1 (regexp-charset-range-to-regexp* (cdr nums1) (cdr nums2)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1176 (let ((part1 (cons ch1 (regexp-charset-range-to-regexp* (cdr nums1) (make-list (length (cdr nums1)) 255))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1177 (part2 (if (<= (1+ ch1) (1- ch2))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1178 (cons (regexp-charset-range-1 (1+ ch1) (1- ch2))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1179 (regexp-charset-range-to-regexp* (make-list len 160) (make-list len 255)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1180 nil))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1181 (part3 (cons ch2 (regexp-charset-range-to-regexp* (make-list len 160) (cdr nums2)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1182 (if part2
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1183 (list (list ':or (cons ':seq part1) (cons ':seq part2) (cons ':seq part3)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1184 (list (list ':or (cons ':seq part1) (cons ':seq part3)))))))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1185
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1186 (defun regexp-charset-range-1 (from to)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1187 (let ((result nil))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1188 (while (<= from to)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1189 (TREX-push to result)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1190 (TREX-dec to))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1191 (cons ':or result)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1192
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1193 (defun regexp-charset-range-1* (from to)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1194 (if (not (<= from to)) nil
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1195 (cons from (regexp-charset-range-1* (1+ from) to))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1196
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1197 (defvar *regexp-charset-vector* nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1198
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1199 (defun regexp-expand-charset (mode charsets)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1200 (TREX-init *regexp-charset-vector* (make-vector 256 nil))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1201 (let ((i 0))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1202 (while (< i 256)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1203 (aset *regexp-charset-vector* i nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1204 (TREX-inc i)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1205 (while charsets
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1206 (cond((numberp (car charsets))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1207 (aset *regexp-charset-vector* (car charsets) t))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1208 ((stringp (car charsets))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1209 (if (= (length (car charsets)) 1)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1210 (aset *regexp-charset-vector* (aref (car charsets) 0) t)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1211 (let ((list (TREX-string-to-list (car charsets))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1212 (aset *regexp-charset-vector* (car list)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1213 (regexp-expand-charset-set-mark (cdr list)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1214 (aref *regexp-charset-vector* (car list)))))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1215 ((and (consp (car charsets))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1216 (eq (car (car charsets)) ':range))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1217 (let ((from (aref (nth 1 (car charsets)) 0))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1218 (to (aref (nth 2 (car charsets)) 0)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1219 (if (<= from to)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1220 (if (< to 128)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1221 (let ((char from))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1222 (while (<= char to)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1223 (aset *regexp-charset-vector* char t)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1224 (TREX-inc char)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1225 (let ((from-list (TREX-string-to-list (nth 1 (car charsets))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1226 (to-list (TREX-string-to-list (nth 2 (car charsets)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1227 ;;; $B$I$&$9$s$N!*(B
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1228 ))))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1229 (setq charsets (cdr charsets)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1230 (let ((result nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1231 (i 0))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1232 (while (< i 256)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1233 (if (eq (aref *regexp-charset-vector* i) mode)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1234 (TREX-push (list i) result))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1235 (TREX-inc i))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1236 (nreverse result)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1237
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1238
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1239 (defun regexp-expand-charset-set-mark (chars alist)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1240 (if (null chars) t
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1241 (let ((place (assoc (car chars) alist)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1242 (cond((null place)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1243 (cons
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1244 (cons (car chars)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1245 (regexp-expand-charset-set-mark (cdr chars) nil))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1246 alist))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1247 (t
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1248 (setcdr place
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1249 (regexp-expand-charset-set-mark (cdr chars) (cdr place)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1250 alist)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1251
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1252 (defun regexp-expand-or (regexps)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1253 (if regexps
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1254 (append (regexp-expand-regexp (car regexps))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1255 (regexp-expand-or (cdr regexps)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1256 nil))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1257
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1258 (defun regexp-expand-seq (regexps)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1259 (if (null regexps)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1260 (list nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1261 (let ((result (regexp-expand-regexp (car regexps))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1262 (if (TREX-memequal nil result)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1263 (let ((newresult (regexp-expand-seq (cdr regexps))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1264 (setq result (TREX-delete nil result))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1265 (while result
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1266 (TREX-push (append (car result) (cdr regexps)) newresult)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1267 (setq result (cdr result)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1268 newresult)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1269 (let ((newresult nil))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1270 (while result
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1271 (TREX-push (append (car result) (cdr regexps)) newresult)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1272 (setq result (cdr result)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1273 newresult)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1274
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1275 (defun regexp-expand-items (items)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1276 (if items
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1277 (append (regexp-expand-seq (car items))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1278 (regexp-expand-items (cdr items)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1279 nil))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1280
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1281 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1282 ;;; regexp-
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1283 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1284
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1285 (defun regexp-make-island (items)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1286 (let ((result (TREX-delete-duplicate (regexp-expand-items items))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1287 (let ((l result))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1288 (while l
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1289 (cond((null (car l))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1290 (setcdr l nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1291 (setq l nil))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1292 (t (setq l (cdr l))))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1293 result))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1294
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1295 (defun regexp-make-island-parallel (items)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1296 (regexp-sort (TREX-delete-duplicate (regexp-expand-items items))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1297 'regexp-item-lessp))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1298
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1299
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1300 ;;; Finate state Automaton:
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1301 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1302 ;;; FA : Non-deterministic FA
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1303 ;;; EFFA : Epsilon Free FA
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1304 ;;; DFA : Deterministic FA
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1305 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1306 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1307 ;;; DFA-optimize <- DFA <- EFFA <- NDFA <- regexp
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1308
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1309
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1310 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1311 ;;; Table structure
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1312 ;;; <FA> ::= ( <START> . <TransTables> )
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1313 ;;; <TransTables> ::= ( <Node> . <TransTable> ) ...
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1314 ;;; <TransTable> ::= ( <Key> . <Next> ) ...
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1315 ;;; <Key> ::= <Char> | <Condition> | :epsilon
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1316 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1317
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1318 (defvar *regexp-node-to-transtable* nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1319 (defvar *regexp-island-to-node* nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1320 (defvar *regexp-counter* 0)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1321
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1322 (defun FA-make (regexp)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1323 (setq *regexp-island-to-node* nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1324 (let ((*regexp-node-to-transtable* nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1325 ;;; (*regexp-island-to-node* nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1326 (*regexp-counter* 0))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1327 (let ((island (regexp-make-island (regexp-expand-regexp regexp))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1328 (cons (FA-make-closure island) (nreverse *regexp-node-to-transtable*)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1329
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1330 (defun FA-make-closure (island)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1331 (if *regexp-debug* (princ (format "FA-make-closure %s\n" island)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1332 (if (null island) nil
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1333 (let ((place (assoc island *regexp-island-to-node*))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1334 (pos nil))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1335 (cond(place (cdr place))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1336 ;;; START_MEMORY and STOP_MEMORY $B!JL5>r7o!$:GM%@h$GA+0\$9$k$b$N!K(B
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1337 ((setq pos (TREX-find-if 'regexp-item-key-class0 island))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1338 (let ((pre (TREX-firstn island pos))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1339 (item (nth pos island))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1340 (post (nthcdr (1+ pos) island)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1341 (let* ((number (TREX-inc *regexp-counter*))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1342 (pair (cons (car item) nil))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1343 (alist (list pair))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1344 (place (cons number alist)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1345 (TREX-push (cons island number) *regexp-island-to-node*)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1346 (TREX-push place *regexp-node-to-transtable*)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1347 (setcdr pair
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1348 (FA-make-closure
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1349 (regexp-make-island (append pre (list (cdr item)) post))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1350 number)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1351 ;;; BEGLINE, ENDLINE, WORDBEG, ....$B!JD9$5#0$N$b$N!K(B
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1352 ;;; $BA+0\$O(B
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1353 ;;; KEY --> TRUE+FALSE
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1354 ;;; :epsilon --> FALSE $B$H$J$k!%(B
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1355 ((setq pos (TREX-find-if 'regexp-item-key-class1 island))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1356 (let((key (car (nth pos island)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1357 (items island)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1358 (result-true nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1359 (result-false nil))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1360 (while items
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1361 (let ((item (car items)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1362 (if (equal key (car item))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1363 (TREX-push (cdr item) result-true)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1364 (progn
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1365 (TREX-push item result-true)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1366 (TREX-push item result-false))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1367 (setq items (cdr items)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1368 (setq result-true (nreverse result-true)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1369 result-false (nreverse result-false))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1370 (if (null result-false)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1371 (let* ((number (TREX-inc *regexp-counter*))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1372 (pair-true (cons key nil))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1373 (alist (list pair-true))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1374 (place (cons number alist)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1375 (TREX-push (cons island number) *regexp-island-to-node*)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1376 (TREX-push place *regexp-node-to-transtable*)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1377 (setcdr pair-true (FA-make-closure (regexp-make-island result-true)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1378 number)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1379 (let* ((number (TREX-inc *regexp-counter*))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1380 (pair-true (cons key nil))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1381 (pair-false (cons ':epsilon nil))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1382 (alist (list pair-true pair-false))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1383 (place (cons number alist)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1384 (TREX-push (cons island number) *regexp-island-to-node*)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1385 (TREX-push place *regexp-node-to-transtable*)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1386 (setcdr pair-true (FA-make-closure (regexp-make-island result-true)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1387 (setcdr pair-false (FA-make-closure (regexp-make-island result-false)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1388 number))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1389 (t
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1390 (FA-make-closure* island (FA-make-pre-alist island)))))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1391
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1392 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1393 ;;; $B$3$3$G07$&$N$O(B class2,3,4 $B$N$_(B
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1394 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1395 (defun FA-make-closure* (island pre-alist)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1396 (if *regexp-debug* (princ (format "\nregexp-make-clousre* %s" pre-alist)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1397 (let* ((number (TREX-inc *regexp-counter*))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1398 (place (cons number pre-alist)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1399 (TREX-push (cons island number) *regexp-island-to-node*)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1400 (TREX-push place *regexp-node-to-transtable*)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1401 (while pre-alist
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1402 (let ((pair (car pre-alist)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1403 (setcdr pair
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1404 (FA-make-closure (regexp-make-island (cdr pair)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1405 (setq pre-alist (cdr pre-alist)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1406 number))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1407
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1408 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1409 ;;; PRE-ALIST ::= ( (key . items) ... )
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1410 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1411
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1412 (defun FA-make-pre-alist (items)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1413 (let ((pre-alist nil))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1414 (while items
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1415 (let ((item (car items)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1416 (cond((or (regexp-key-class2 (car item))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1417 (regexp-key-class3 (car item)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1418 (let ((key (car item))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1419 (newitems nil))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1420 (while (and items (equal key (car (car items))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1421 (TREX-push (cdr (car items)) newitems)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1422 (setq items (cdr items)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1423 (setq newitems (nreverse newitems))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1424 (TREX-push (cons key newitems) pre-alist)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1425 ((null item)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1426 (TREX-push (list nil) pre-alist)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1427 (setq items (cdr items)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1428 ((regexp-key-class4 (car item))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1429 (let((alist nil))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1430 (while (and items (regexp-key-class4 (car (car items))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1431 (let* ((newitem (car items))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1432 (place (assoc (car newitem) alist)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1433 (if place
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1434 (setcdr place
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1435 (cons (cdr newitem) (cdr place)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1436 (TREX-push (cons (car newitem) (list (cdr newitem))) alist)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1437 (setq items (cdr items)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1438 (setq alist (sort alist 'TREX-lessp-car))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1439 (let ((list alist))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1440 (while list
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1441 (setcdr (car list) (nreverse (cdr (car list))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1442 (setq list (cdr list)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1443 (setq pre-alist (append alist pre-alist))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1444 )))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1445 (t (error "undefined items(%s)" item)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1446 (nreverse pre-alist)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1447
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1448 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1449 ;;; FA-inverse
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1450 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1451
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1452 (defun FA-inverse (FA)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1453 (let ((invFA nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1454 (start (car FA))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1455 (table (cdr FA))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1456 (minnode 10000)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1457 (maxnode 0)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1458 (newtable nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1459 (newstart nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1460 (newfinal nil))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1461 (let ((l table))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1462 (while l
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1463 (let ((n (car (car l))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1464 (if (< n minnode) (setq minnode n))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1465 (if (< maxnode n) (setq maxnode n)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1466 (setq l (cdr l))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1467 (setq newstart (1- minnode))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1468 (setq newfinal (1+ maxnode))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1469 (setq newtable (FA-link newfinal nil nil newtable))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1470 (while table
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1471 (let* ((Snode (car table))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1472 (Snumber (car Snode))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1473 (Salist (cdr Snode)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1474 (while Salist
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1475 (let* ((pair (car Salist))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1476 (key (car pair))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1477 (Tnumber (cdr pair)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1478 (cond((null key)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1479 (setq newtable (FA-link newstart ':epsilon Snumber newtable)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1480 (t
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1481 (setq newtable (FA-link Tnumber key Snumber newtable))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1482 (setq Salist (cdr Salist)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1483 (setq table (cdr table)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1484 (setq newtable (FA-link start ':epsilon newfinal newtable))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1485 ;;;; FA $B$N(B final $B$X(B invFA $B$N(B start $B$+$i(B :epsilon link $B$rD%$k!%(B
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1486 (let ((l newtable))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1487 (while l
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1488 (setcdr (car l) (reverse (cdr(car l))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1489 (setq l (cdr l))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1490 (setq newtable (sort newtable 'TREX-lessp-car))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1491 (cons newstart newtable)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1492
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1493 (defun FA-link (from key to table)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1494 (let ((place (assoc from table)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1495 (cond ((null place )
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1496 (setq place (cons from nil))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1497 (TREX-push place table)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1498 (setcdr place (cons (cons key to) (cdr place)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1499 table))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1500
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1501 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1502 ;;; FA-dump
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1503 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1504
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1505 (defun FA-dump (table)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1506 (let ((start (car table))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1507 (l (cdr table)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1508 (princ (format "\nstart = %d\n" start))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1509 (while l
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1510 (princ (format "%3d: " (car (car l))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1511 (let ((alist (cdr (car l))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1512 (cond ((numberp (car (car alist)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1513 (princ (format "%c -> %s\n" (car (car alist)) (cdr (car alist)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1514 ((and (consp (car (car alist))) (TREX-memequal (car (car (car alist))) '(CATEGORYSPEC NOTCATEGORYSPEC)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1515 (princ (format "(%s %c) -> %s\n" (car (car (car alist))) (nth 1 (car (car alist))) (cdr (car alist)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1516 (t
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1517 (princ (format "%s -> %s\n" (car (car alist)) (cdr (car alist))))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1518 (setq alist (cdr alist))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1519 (while alist
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1520 (cond ((numberp (car (car alist)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1521 (princ (format " %c -> %s\n" (car (car alist)) (cdr (car alist)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1522 ((and (consp (car (car alist))) (TREX-memequal (car (car (car alist))) '(CATEGORYSPEC NOTCATEGORYSPEC)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1523 (princ (format " (%s %c) -> %s\n" (car (car (car alist))) (nth 1 (car (car alist))) (cdr (car alist)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1524 (t
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1525 (princ (format " %s -> %s\n" (car (car alist)) (cdr (car alist))))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1526 (setq alist (cdr alist))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1527 (setq l (cdr l)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1528
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1529 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1530 ;;; EFFA: Epsilon Free Finate Automaton
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1531 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1532
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1533 (defvar *FA-table* nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1534 (defvar *EFFA-table* nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1535
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1536 (defun EFFA-make (FA)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1537 (let* ((start (car FA))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1538 (*FA-table* (cdr FA))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1539 (newstart start)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1540 (*EFFA-table* nil))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1541 (cons newstart (reverse (EFFA-make* start)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1542
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1543 (defun EFFA-make* (node)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1544 (let ((place (assoc node *EFFA-table*)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1545 (cond((null place)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1546 (let ((place (cons node nil)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1547 (TREX-push place *EFFA-table*)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1548 (setcdr place
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1549 (reverse (EFFA-make-alist nil (cdr (assoc node *FA-table*))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1550 (list node))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1551 (let ((alist (cdr place)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1552 (while alist
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1553 (cond((car (car alist))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1554 (EFFA-make* (cdr (car alist)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1555 (setq alist (cdr alist))))))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1556 *EFFA-table*)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1557
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1558 (defun EFFA-make-alist (newalist alist set)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1559 (while alist
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1560 (let ((node (cdr (car alist))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1561 (cond((eq (car (car alist)) ':epsilon)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1562 (cond((not (TREX-memequal node set))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1563 (TREX-push node set)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1564 (setq newalist
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1565 (EFFA-make-alist newalist (cdr (assoc node *FA-table*)) set)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1566 (t
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1567 (TREX-push (car alist) newalist))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1568 (setq alist (cdr alist)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1569 newalist)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1570
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1571 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1572 ;;; DFA: Deterministic Finate Automata
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1573 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1574
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1575 (defvar *DFA-node-counter* nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1576
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1577 (defvar *DFA-node-definitions* nil
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1578 "List of FD-nodes to node number")
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1579
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1580 (defvar *DFA-table* nil
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1581 "node number to alist")
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1582
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1583 (defun DFA-make (EFFA)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1584 (let ((start (car EFFA))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1585 (*EFFA-table* (cdr EFFA))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1586 (*DFA-node-counter* 0)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1587 (*DFA-node-definitions* nil )
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1588 (*DFA-table* nil))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1589 (DFA-make-1 (list start))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1590 (cons (cdr (assoc (list start) *DFA-node-definitions*)) *DFA-table*)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1591
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1592 (defun DFA-make-1 (states)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1593 (let ((place (assoc states *DFA-node-definitions*)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1594 (cond((null place)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1595 (TREX-inc *DFA-node-counter*)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1596 (setq place (cons states *DFA-node-counter*))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1597 (TREX-push place *DFA-node-definitions*)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1598 (let ((pair (cons *DFA-node-counter* nil)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1599 (TREX-push pair *DFA-table*)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1600 (setcdr pair (DFA-make-pre-alist (DFA-collect-alist states)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1601 (let ((alist (cdr pair)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1602 (while alist
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1603 (let ((top (car alist)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1604 (if (car top)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1605 (setcdr top
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1606 (DFA-make-1 (cdr top)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1607 (setq alist (cdr alist))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1608 )))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1609 (cdr place)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1610
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1611 (defun DFA-collect-alist (states)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1612 (let ((result nil))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1613 (while states
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1614 (setq result (append (cdr (assoc (car states) *EFFA-table*)) result))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1615 (setq states (cdr states)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1616 result))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1617
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1618 (defun DFA-make-pre-alist (oldAlist)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1619 (let ((pre-alist nil))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1620 (while oldAlist
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1621 (let ((oldKey (car (car oldAlist))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1622 (cond((or (regexp-key-class0 oldKey)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1623 (regexp-key-class1 oldKey)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1624 (regexp-key-class2 oldKey)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1625 (regexp-key-class3 oldKey))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1626 (let ((key oldKey)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1627 (newAlist nil))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1628 (while (and oldAlist (equal key (car (car oldAlist))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1629 (TREX-push (cdr (car oldAlist)) newAlist)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1630 (setq oldAlist (cdr oldAlist)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1631 (setq newAlist (nreverse newAlist))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1632 (TREX-push (cons key newAlist) pre-alist)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1633 ((regexp-key-class4 oldKey)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1634 (let((alist nil))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1635 (while (and oldAlist (regexp-key-class4 (car (car oldAlist))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1636 (let ((place (assoc (car (car oldAlist)) alist)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1637 (if place
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1638 (setcdr place
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1639 (cons (cdr (car oldAlist)) (cdr place)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1640 (TREX-push (cons (car (car oldAlist)) (list(cdr (car oldAlist)))) alist)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1641 (setq oldAlist (cdr oldAlist)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1642 (setq alist (sort alist 'TREX-lessp-car))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1643 (let ((list alist))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1644 (while list
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1645 (setcdr (car list) (reverse (cdr (car list))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1646 (setq list (cdr list)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1647 (setq pre-alist (append alist pre-alist))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1648 )))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1649 ((null oldKey)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1650 (TREX-push (list nil) pre-alist)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1651 (setq oldAlist (cdr oldAlist)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1652 (t
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1653 (setq oldAlist (cdr oldAlist))))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1654 (nreverse pre-alist)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1655
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1656 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1657 ;;; DFA-optimize
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1658 ;;; $B$3$3$G$N:GE,2=$O>H9g=g=x$rJ]B8$9$k!%(B
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1659 ;;; longer match $B$J$I$r$9$k>l9g$OJQ99$9$kI,MW$,$"$k!%(B
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1660
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1661 (defvar *DFA-optimize-debug* nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1662
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1663 (defvar *DFA-optimize-groups* nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1664 (defvar *DFA-optimize-node* 1)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1665
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1666 (defun DFA-optimize (FA)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1667 (if *DFA-optimize-debug* (terpri))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1668 (let* ((start (car FA))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1669 (table (cdr FA))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1670 (*DFA-optimize-node* 1)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1671 (*DFA-optimize-groups*
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1672 (list (cons *DFA-optimize-node* (mapcar 'car table)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1673 (while
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1674 (catch 'DFA-optimize-changed
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1675 (let ((groups *DFA-optimize-groups*))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1676 (while groups
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1677 (if *DFA-optimize-debug*
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1678 (princ (format "\nGroups to be checked: %s\n" groups)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1679 (let* ((Sgroup (car groups))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1680 (Sgroup-number (car Sgroup))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1681 (oldgroup (cdr Sgroup))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1682 (newgroup nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1683 (Smembers oldgroup))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1684 (if *DFA-optimize-debug*
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1685 (princ (format " Sgroup-number: %s = %s\n" Sgroup-number Smembers)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1686 (while Smembers
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1687 (let* ((Snumber (car Smembers))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1688 (Salist (cdr (assoc Snumber table))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1689 (if *DFA-optimize-debug*
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1690 (princ (format " Snumber: %s\n" Snumber)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1691 (let ((Tmembers (cdr Smembers)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1692 (while Tmembers
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1693 (if (not (eq Snumber (car Tmembers)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1694 (let* ((Tnumber (car Tmembers))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1695 (Talist (cdr (assoc Tnumber table)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1696 (Salist Salist))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1697 (if *DFA-optimize-debug*
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1698 (princ (format " Tnumber: %s\n" Tnumber)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1699 (while (and Talist Salist
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1700 (equal (car (car Talist))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1701 (car (car Salist))) ;;; key
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1702 (equal (DFA-optimize-group-number
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1703 (cdr (car Talist)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1704 (DFA-optimize-group-number
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1705 (cdr (car Salist))) ;;; next group
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1706 ))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1707 (if *DFA-optimize-debug*
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1708 (progn
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1709 (princ (format " Skey: %s -> %s(%s)\n"
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1710 (car (car Salist))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1711 (cdr (car Salist))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1712 (DFA-optimize-group-number (cdr (car Salist)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1713 (princ (format " Tkey: %s -> %s(%s)\n"
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1714 (car (car Talist))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1715 (cdr (car Talist))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1716 (DFA-optimize-group-number (cdr (car Talist)))))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1717 (setq Talist (cdr Talist)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1718 Salist (cdr Salist)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1719 (cond((or Talist Salist)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1720 (setq newgroup (cons Tnumber newgroup)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1721 oldgroup (TREX-delete Tnumber oldgroup))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1722 (if *DFA-optimize-debug*
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1723 (princ(format " oldGroup : %s\n newGroup : %s\n" oldgroup newgroup)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1724 ))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1725 (setq Tmembers (cdr Tmembers)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1726 (cond (newgroup
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1727 (if *DFA-optimize-debug*
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1728 (princ (format "Changed :%s --> " Sgroup)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1729 (setcdr Sgroup oldgroup)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1730 (if *DFA-optimize-debug*
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1731 (princ (format "%s" Sgroup)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1732 (TREX-inc *DFA-optimize-node*)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1733 (if *DFA-optimize-debug*
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1734 (princ (format "+%s\n" (cons *DFA-optimize-node* newgroup))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1735 (TREX-push (cons *DFA-optimize-node* newgroup) *DFA-optimize-groups*)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1736 (throw 'DFA-optimize-changed t)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1737 (setq Smembers (cdr Smembers))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1738 (setq groups (cdr groups))))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1739 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1740 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1741 (if *DFA-optimize-debug*
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1742 (princ (format "table: %s\n" table)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1743 (if *DFA-optimize-debug*
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1744 (princ (format "groups: %s\n" *DFA-optimize-groups*)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1745 (let ((newtable nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1746 (newstart nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1747 (groups *DFA-optimize-groups*))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1748
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1749 ;;; start node $B$rC5$9(B
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1750 (let ((l *DFA-optimize-groups*))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1751 (while l
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1752 (cond((TREX-memequal start (cdr (car l)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1753 (setq newstart (car (car l)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1754 (setq l nil))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1755 (t
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1756 (setq l (cdr l))))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1757
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1758 ;;; $B?7$7$$(B transTable $B$r:n$k!%(B
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1759 (while groups
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1760 (let* ((group (car groups))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1761 (group-number (car group))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1762 (member-number (car (cdr group)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1763 (member-alist (cdr (assoc member-number table))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1764 (TREX-push (cons group-number
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1765 (let ((group-alist nil))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1766 (while member-alist
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1767 (let ((Mkey (car (car member-alist)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1768 (Mnext (cdr (car member-alist))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1769 (TREX-push (cons Mkey (DFA-optimize-group-number Mnext))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1770 group-alist))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1771 (setq member-alist (cdr member-alist)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1772 (nreverse group-alist)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1773 newtable)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1774 (setq groups (cdr groups))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1775 (cons newstart newtable))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1776
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1777 (defun DFA-optimize-group-number (node)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1778 (let ((l *DFA-optimize-groups*) (result nil))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1779 (while l
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1780 (cond((TREX-memequal node (cdr (car l)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1781 (setq result (car (car l))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1782 l nil))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1783 (t (setq l (cdr l)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1784 result))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1785
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1786 (defun DFA-optimize-parallel (FA)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1787 (if *DFA-optimize-debug* (terpri))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1788 (let* ((start (car FA))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1789 (table (cdr FA))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1790 (*DFA-optimize-node* 1)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1791 (*DFA-optimize-groups*
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1792 (list (cons *DFA-optimize-node* (mapcar 'car table)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1793 (while
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1794 (catch 'DFA-optimize-changed
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1795 (let ((groups *DFA-optimize-groups*))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1796 (while groups
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1797 (if *DFA-optimize-debug*
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1798 (princ (format "\nGroups to be checked: %s\n" groups)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1799 (let* ((Sgroup (car groups))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1800 (Sgroup-number (car Sgroup))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1801 (oldgroup (cdr Sgroup))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1802 (newgroup nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1803 (Smembers oldgroup))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1804 (if *DFA-optimize-debug*
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1805 (princ (format " Sgroup-number: %s = %s\n" Sgroup-number Smembers)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1806 (while Smembers
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1807 (let* ((Snumber (car Smembers))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1808 (Salist (cdr (assoc Snumber table))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1809 (if *DFA-optimize-debug*
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1810 (princ (format " Snumber: %s\n" Snumber)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1811 (while Salist
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1812 (let* ((Spair (car Salist))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1813 (Skey (car Spair))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1814 (Snext (cdr Spair))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1815 (Snext-group (DFA-optimize-group-number Snext))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1816 (Tmembers oldgroup))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1817 (if *DFA-optimize-debug*
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1818 (princ (format " Skey: %s -> %s(%s)\n" Skey Snext-group Snext)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1819 (while Tmembers
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1820 (if (not (eq Snumber (car Tmembers)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1821 (let* ((Tnumber (car Tmembers))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1822 ;;; $BMW:F8!F$(B
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1823 (Tpair (assoc Skey (cdr (assoc Tnumber table))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1824 (Tnext (cdr Tpair))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1825 (Tnext-group (DFA-optimize-group-number (cdr Tpair))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1826 (if *DFA-optimize-debug*
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1827 (princ (format " Tnumber: %s : %s -> %s(%s)\n" Tnumber (car Tpair)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1828 (DFA-optimize-group-number (cdr Tpair))(cdr Tpair))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1829 (cond((and (equal Spair '(nil))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1830 (equal Tpair '(nil))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1831 ((and Skey (equal Snext-group Tnext-group)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1832 (t
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1833 (TREX-push Tnumber newgroup)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1834 (setq oldgroup (TREX-delete Tnumber oldgroup))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1835 (if *DFA-optimize-debug*
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1836 (princ(format (format " oldGroup : %s\n newGroup : %s\n" oldgroup newgroup))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1837 ))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1838 (setq Tmembers (cdr Tmembers)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1839 (cond (newgroup
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1840 (if *DFA-optimize-debug*
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1841 (princ (format "Changed :%s --> " Sgroup)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1842 (setcdr Sgroup oldgroup)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1843 (if *DFA-optimize-debug*
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1844 (princ (format "%s" Sgroup)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1845 (TREX-inc *DFA-optimize-node*)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1846 (if *DFA-optimize-debug*
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1847 (princ (format "+%s\n" (cons *DFA-optimize-node* newgroup))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1848 (TREX-push (cons *DFA-optimize-node* newgroup) *DFA-optimize-groups*)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1849 (throw 'DFA-optimize-changed t))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1850 (setq Salist (cdr Salist))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1851 (setq Smembers (cdr Smembers))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1852 (setq groups (cdr groups))))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1853 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1854 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1855 (if *DFA-optimize-debug*
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1856 (princ (format "table: %s\n" table)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1857 (if *DFA-optimize-debug*
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1858 (princ (format "groups: %s\n" *DFA-optimize-groups*)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1859 (let ((newtable nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1860 (newstart nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1861 (groups *DFA-optimize-groups*))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1862
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1863 ;;; start node $B$rC5$9(B
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1864 (let ((l *DFA-optimize-groups*))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1865 (while l
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1866 (cond((TREX-memequal start (cdr (car l)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1867 (setq newstart (car (car l)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1868 (setq l nil))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1869 (t
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1870 (setq l (cdr l))))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1871
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1872 ;;; $B?7$7$$(B transTable $B$r:n$k!%(B
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1873 (while groups
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1874 (let* ((group (car groups))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1875 (group-number (car group))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1876 (member-number (car (cdr group)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1877 (member-alist (cdr (assoc member-number table))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1878 (TREX-push (cons group-number
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1879 (let ((group-alist nil))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1880 (while member-alist
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1881 (let ((Mkey (car (car member-alist)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1882 (Mnext (cdr (car member-alist))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1883 (TREX-push (cons Mkey
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1884 (if (consp Mnext)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1885 (cons (DFA-optimize-group-number (car Mnext))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1886 (DFA-optimize-group-number (cdr Mnext)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1887 (DFA-optimize-group-number Mnext)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1888 group-alist))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1889 (setq member-alist (cdr member-alist)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1890 group-alist))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1891 newtable)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1892 (setq groups (cdr groups))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1893 (cons newstart newtable))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1894
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1895
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1896
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1897 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1898 ;;; Non Empty Finite Automata
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1899 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1900
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1901 (defun NEFA-make (EFFA)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1902 (let* ((start (car EFFA))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1903 (table (cdr EFFA))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1904 (Salist (cdr (assoc start table))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1905 (cond((equal Salist '((nil)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1906 nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1907 ((and (assoc nil Salist)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1908 (progn
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1909 (while (and Salist (not (equal start (cdr (car Salist)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1910 (setq Salist (cdr Salist)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1911 Salist))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1912 (let ((min 10000)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1913 (max -10000)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1914 (l table))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1915 (while l
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1916 (if (< (car (car l)) min)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1917 (setq min (car (car l))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1918 (if (< max (car (car l)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1919 (setq max (car (car l))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1920 (setq l (cdr l)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1921 (let* ((newstart (1- min))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1922 (newtable (copy-alist table))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1923 (oldSalist (cdr (assoc start table)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1924 (newSalist (TREX-delete '(nil) (copy-alist oldSalist))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1925 (cons newstart
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1926 (cons (cons newstart newSalist) newtable)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1927 (t
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1928 EFFA))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1929
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1930 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1931 ;;; Simplify FA
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1932 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1933
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1934 (defvar *FA-simplify-table* nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1935
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1936 (defun FA-simplify (FA)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1937 (let ((start (car FA))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1938 (table (cdr FA))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1939 (newtable nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1940 (*FA-simplify-table* nil))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1941 (FA-simplify-mark start table)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1942 (while *FA-simplify-table*
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1943 (TREX-push (assoc (car *FA-simplify-table*) table) newtable)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1944 (setq *FA-simplify-table* (cdr *FA-simplify-table*)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1945 (cons start newtable)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1946
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1947 (defun FA-simplify-mark (node table)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1948 (cond ((not (TREX-memequal node *FA-simplify-table*))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1949 (TREX-push node *FA-simplify-table*)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1950 (let ((alist (cdr (assoc node table))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1951 (while alist
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1952 (cond((car (car alist))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1953 (FA-simplify-mark (cdr (car alist)) table)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1954 (setq alist (cdr alist)))))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1955
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1956 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1957 ;;; Shortest match DFA
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1958 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1959
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1960 (defun DFA-shortest-match (DFA)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1961 (let ((start (car DFA))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1962 (table (cdr DFA))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1963 (newtable nil))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1964 (while table
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1965 (cond ((assoc nil (cdr (car table)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1966 (TREX-push (cons (car (car table)) '((nil))) newtable))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1967 (t
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1968 (TREX-push (car table) newtable)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1969 (setq table (cdr table)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1970 (cons start newtable)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1971
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1972 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1973 ;;; Fastmap computation
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1974 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1975
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1976 (defvar *DFA-fastmap-chars* nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1977 (defvar *DFA-fastmap-syntax* nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1978 (defvar *DFA-fastmap-category* nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1979 (defvar *DFA-fastmap-init* 0 )
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1980 (defvar *DFA-fastmap-pos* 1 ) ;;; SYNTAXSPEC or CATEGORYSPEC
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1981 (defvar *DFA-fastmap-neg* 2 ) ;;; NOTSYNTAXSPEC or NOTCATEGORYSPEC
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1982
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1983 ;;;; $B$9$Y$F$N(B char $B$OB~0l$D$N(B syntaxspec $B$KB0$9$k(B
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1984 ;;;; ==> syntaxspec(ch) and notsyntaxspec(ch) --> all char
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1985 ;;;; ==> notsyntaxspec(ch1) and notsyntaxspec(ch2) --> all char
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1986 ;;;; ==> notsyntaxspec(ch1) and syntaxspec(ch2) == notsyntaxspec(ch1)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1987 ;;;; $B$D$^$j(B notsyntaxspec $B$O9b!9#1$D$7$+$J$$!%(B
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1988
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1989 ;;; Returns [ CODE FASTMAP SYNTAX-FASTMAP CATEGOY-FASTMAP ]
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1990
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1991 (defun DFA-code-with-fastmap (DFA)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1992 (TREX-init *DFA-fastmap-chars* (make-vector 256 nil))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1993 (TREX-init *DFA-fastmap-syntax* (make-vector 256 nil))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1994 (TREX-init *DFA-fastmap-category* (make-vector 256 nil))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1995 (let ((code (regexp-code-gen DFA))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1996 (start (car DFA))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1997 (*DFA-fastmap-table* (cdr DFA))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1998 (*DFA-fastmap-mark* nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1999 (*DFA-fastmap-special* nil))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2000 (let ((i 0))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2001 (while (< i 256)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2002 (aset *DFA-fastmap-chars* i nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2003 (aset *DFA-fastmap-syntax* i nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2004 (aset *DFA-fastmap-category* i nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2005 (TREX-inc i)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2006 (DFA-fastmap-collect start)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2007 (let ((fastmap (if *DFA-fastmap-special*
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2008 nil ;;;(make-string 256 1)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2009 (make-string 256 0)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2010 (fastmap-entries 0)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2011 (syntax (if *DFA-fastmap-special*
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2012 nil
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2013 (make-string 256 0)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2014 (syntax-entries 0)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2015 (notsyntax-entries 0)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2016 (category (if *DFA-fastmap-special*
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2017 nil
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2018 (make-string 256 0)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2019 (category-entries 0))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2020 (let ((result (make-vector 4 nil)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2021 (aset result 0 code)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2022 (if *DFA-fastmap-special*
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2023 (progn
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2024 (aset result 1 fastmap)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2025 (aset result 2 syntax)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2026 (aset result 3 category))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2027 (progn
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2028 (let ((i 0))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2029 (while (< i 256)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2030 (if (aref *DFA-fastmap-chars* i)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2031 (progn
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2032 (TREX-inc fastmap-entries)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2033 (aset fastmap i 1)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2034 (aset syntax i
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2035 (cond((null (aref *DFA-fastmap-syntax* i))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2036 *DFA-fastmap-init*)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2037 ((eq (aref *DFA-fastmap-syntax* i) 'SYNTAXSPEC)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2038 (TREX-inc syntax-entries)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2039 *DFA-fastmap-pos*)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2040 ((eq (aref *DFA-fastmap-syntax* i) 'NOTSYNTAXSPEC)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2041 (TREX-inc notsyntax-entries)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2042 (TREX-inc syntax-entries)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2043 *DFA-fastmap-neg*)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2044 (aset category i
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2045 (cond((null (aref *DFA-fastmap-category* i))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2046 *DFA-fastmap-init*)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2047 ((eq (aref *DFA-fastmap-category* i) 'CATEGORYSPEC)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2048 (TREX-inc category-entries)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2049 *DFA-fastmap-pos*)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2050 ((eq (aref *DFA-fastmap-category* i) 'NOTCATEGORYSPEC)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2051 (TREX-inc category-entries)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2052 *DFA-fastmap-neg*)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2053 (TREX-inc i)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2054
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2055 (cond((<= 2 notsyntax-entries)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2056 (setq fastmap (make-string 256 1)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2057 syntax nil
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2058 category nil))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2059 ((= 1 notsyntax-entries)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2060 (let ((ch 0))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2061 (while (< ch 256)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2062 (if (= (aref syntax ch) *DFA-fastmap-neg*)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2063 (aset syntax ch *DFA-fastmap-init*)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2064 (aset syntax ch *DFA-fastmap-pos*))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2065 (TREX-inc ch)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2066 (aset result 1 fastmap)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2067 (aset result 2 syntax)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2068 (aset result 3 category)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2069 result))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2070
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2071 (defun DFA-fastmap-collect (node)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2072 (if (TREX-memequal node *DFA-fastmap-mark*) nil
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2073 (let ((alist (cdr (assoc node *DFA-fastmap-table*))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2074 (TREX-push node *DFA-fastmap-mark*)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2075 (while alist
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2076 (let ((key (car (car alist))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2077 (cond((numberp key)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2078 (aset *DFA-fastmap-chars* key t))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2079 ((symbolp key);;; can be null
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2080 (setq *DFA-fastmap-special* t))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2081 (t
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2082 (let ((op (car key)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2083 (cond
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2084 ((TREX-memequal op '(START_MEMORY STOP_MEMORY))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2085 (DFA-fastmap-collect (cdr (car alist))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2086 ((TREX-memequal op '(SYNTAXSPEC NOTSYNTAXSPEC))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2087 (let ((specch (syntax-code-spec (nth 1 key))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2088 (cond((null (aref *DFA-fastmap-syntax* (nth 1 key)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2089 (aset *DFA-fastmap-syntax* specch op))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2090 ((not (eq (aref *DFA-fastmap-syntax* specch) op))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2091 (setq *DFA-fastmap-special* t)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2092 ((TREX-memequal op '(CATEGORYSPEC NOTCATEGORYSPEC))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2093 (let ((specch (nth 1 key)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2094 (cond((null (aref *DFA-fastmap-category* specch))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2095 (aset *DFA-fastmap-category* specch op))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2096 ((not (eq (aref *DFA-fastmap-category* specch) op))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2097 (setq *DFA-fastmap-special* t)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2098 ((TREX-memequal op '(CHARSET CHARSET_NOT))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2099 (let ((list (cdr key)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2100 (while list
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2101 (let ((from nil) (to nil))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2102 (cond((stringp (car list))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2103 (setq from (aref (car list) 0)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2104 to (aref (car list) 0)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2105 (t ;;; :range
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2106 (setq from (aref (nth 1 (car list)) 0)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2107 to (aref (nth 2 (car list)) 0))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2108 (while (<= from to)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2109 (cond((null (aref *DFA-fastmap-chars* from))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2110 (aset *DFA-fastmap-chars* from
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2111 (if (eq op 'CHARSET_NOT) 'CHARSET_NOT
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2112 t))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2113 (TREX-inc from)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2114 (setq list (cdr list))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2115 (if (eq op 'CHARSET_NOT)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2116 (let ((i 0))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2117 (while (< i 256)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2118 (cond((null (aref *DFA-fastmap-chars* i))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2119 (aset *DFA-fastmap-chars* i t))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2120 ((eq (aref *DFA-fastmap-chars* i) 'CHARSET_NOT)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2121 (aset *DFA-fastmap-chars* i nil)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2122 (TREX-inc i)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2123 (t
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2124 (setq *DFA-fastmap-special* t)))))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2125 (setq alist (cdr alist))))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2126
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2127 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2128 ;;; $B@55,I=8=%3!<%I$NL?NaI=(B
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2129 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2130
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2131 (if (= regexp-version 19)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2132 (TREX-define-enum
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2133 UNUSED ;;; 18
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2134 EXACTN ;;; 18
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2135 ANYCHAR ;;; 18
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2136 CHARSET ;;; 18
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2137 CHARSET_NOT ;;; 18
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2138 START_MEMORY ;;; 18*
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2139 STOP_MEMORY ;;; 18*
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2140 DUPLICATE ;;; 18
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2141 BEGLINE ;;; 18
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2142 ENDLINE ;;; 18
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2143 BEGBUF ;;; 18
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2144 ENDBUF ;;; 18
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2145 JUMP ;;; 18
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2146 JUMP_PAST_ALT ;;; 19
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2147 ON_FAILURE_JUMP ;;; 18
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2148 ON_FAILURE_KEEP_STRING_JUMP ;;; 19
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2149 ;;;; finalize_jump
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2150 ;;;; maybe_finalize_jump
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2151 POP_FAILURE_JUMP ;;; 19
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2152 MAYBE_POP_JUMP ;;; 19
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2153 DUMMY_FAILURE_JUMP ;;; 18
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2154 PUSH_DUMMY_FAILURE ;;; 19
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2155 SUCCEED_N ;;; 19
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2156 JUMP_N ;;; 19
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2157 SET_NUMBER_AT ;;; 19
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2158 WORDCHAR ;;; 18
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2159 NOTWORDCHAR ;;; 18
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2160 WORDBEG ;;; 18
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2161 WORDEND ;;; 18
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2162 WORDBOUND ;;; 18
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2163 NOTWORDBOUND ;;; 18
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2164 BEFORE_DOT ;;; 18
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2165 AT_DOT ;;; 18
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2166 AFTER_DOT ;;; 18
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2167 SYNTAXSPEC ;;; 18
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2168 NOTSYNTAXSPEC ;;; 18
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2169 ;;; TREX code
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2170 EXACT1
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2171 EXACT2
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2172 EXACT3
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2173 CHARSET_M
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2174 CHARSET_M_NOT
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2175 CASEN
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2176 SUCCESS_SHORT
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2177 SUCCESS
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2178 POP
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2179 EXCEPT0
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2180 EXCEPT1
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2181 CATEGORYSPEC
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2182 NOTCATEGORYSPEC
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2183 RANGE
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2184 RANGE_A
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2185 )
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2186 ;; else regexp-version == 18.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2187 (TREX-define-enum
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2188 UNUSED
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2189 EXACTN
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2190 BEGLINE
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2191 ENDLINE
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2192 JUMP
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2193 ON_FAILURE_JUMP
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2194 FINALIZE_JUMP
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2195 MAYBE_FINALIZE_JUMP
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2196 DUMMY_FAILURE_JUMP
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2197 ANYCHAR
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2198 CHARSET
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2199 CHARSET_NOT
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2200 START_MEMORY
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2201 STOP_MEMORY
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2202 DUPLICATE
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2203 BEFORE_DOT ;;; not used
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2204 AT_DOT ;;; not used
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2205 AFTER_DOT ;;; not used
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2206 BEGBUF
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2207 ENDBUF
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2208 WORDCHAR ;;; not used
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2209 NOTWORDCHAR ;;; not used
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2210 WORDBEG
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2211 WORDEND
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2212 WORDBOUND
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2213 NOTWORDBOUND
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2214 SYNTAXSPEC
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2215 NOTSYNTAXSPEC
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2216 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2217 ;;; extended instructions
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2218 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2219 EXACT1
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2220 EXACT2
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2221 EXACT3
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2222 CHARSET_M
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2223 CHARSET_M_NOT
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2224 CASEN
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2225 SUCCESS_SHORT ;;; == ON_FAILURE_SUCCESS
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2226 SUCCESS
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2227 POP
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2228 EXCEPT0 ;;; ALLCHAR
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2229 EXCEPT1
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2230 CATEGORYSPEC
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2231 NOTCATEGORYSPEC
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2232 ))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2233
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2234 (defvar ON_FAILURE_SUCCESS SUCCESS_SHORT)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2235
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2236 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2237 ;;; ANYCHAR = EXCEPT1 \n
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2238 ;;; ALLCHAR = EXCEPT0
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2239
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2240
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2241 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2242 ;;; $B@55,I=8=>H9g4o$NL?NaBN7O(B
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2243 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2244 ;;; UNUSED
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2245 ;;; EXACTN n ch1 ch2 ... chn
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2246 ;;; BEGLINE
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2247 ;;; ENDLINE
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2248 ;;; JUMP disp[2]
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2249 ;;; +JUMP_PAST_ALT disp[2]
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2250 ;;; ON_FAILURE_JUMP disp[2]
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2251 ;;; +ON_FAILURE_KEEP_STRING_JUMP disp[2]
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2252 ;;; -FINALIZE_JUMP disp[2]
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2253 ;;; -MAYBE_FINALIZE_JUMP disp[2]
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2254 ;;; +POP_FAILURE_JUMP disp[2]
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2255 ;;; +MAYBE_POP_JUMP disp[2]
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2256 ;;; DUMMY_FAILURE_JUMP disp[2]
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2257 ;;; +PUSH_DUMMY_FAILURE
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2258 ;;; +SUCCEED_N disp[2] n[2]
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2259 ;;; +JUMP_N disp[2] n[2]
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2260 ;;; +SET_NUMBER_AT disp[2] n[2]
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2261 ;;; ANYCHAR
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2262 ;;; CHARSET n b1 b2 ... bn
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2263 ;;;**CHARSET 0xff l1 l2 cf1 ct1 cf2 ct2 ... cfn ctn
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2264 ;;; CHARSET_NOT n b1 b2 ... bn
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2265 ;;;**CHARSET_NOT 0xff l1 l2 cf1 ct1 cf2 ct2 ... cfn ctn
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2266 ;;; $B0J2<$O$($J$_;a$NDs0F$K$h$k?7$?$J%;%^%s%F%#%C%/%9(B
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2267 ;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2268 ;;; CHARSET n b1 b2 ... bn (n < 0x80)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2269 ;;; CHARSET n+0x80 b1 b2 ... bn
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2270 ;;; |<-- n bytes -->|
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2271 ;;; lh lo CHARF1 CHART1 .... CHARFm CHARTm
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2272 ;;; |<- lh << 8 + lo bytes ->|
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2273 ;; CHARSET n b1 b2 ... bn lh lo cf1 ct1 cf2 ct2 ... cfn ctn
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2274 ;; |<- bitmap ->| |<- range table ->|
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2275 ;; CHARSET_NOT n b1 b2 ... bn lh lo cf1 ct1 cf2 ct2 ... cfn ctn
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2276 ;; CHARSETM m n b1 b2 ... bn lh lo cf1 ct1 cf2 ct2 ... cfn ctn
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2277 ;; CHARSETM_NOT m n b1 b2 ... bn lh lo cf1 ct1 cf2 ct2 ... cfn ctn
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2278 ;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2279 ;; o cfx, ctx $B0J30$O$9$Y$F(B 1byte. cfx, ctx $B$O(B multi byte
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2280 ;; character.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2281 ;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2282 ;; o CHARSET(_NOT) $B$H(B CHARSETM(_NOT) $B$H$N0c$$$O(B, CHARSETM(_NOT)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2283 ;; $B$N>l9g$K$O(B bitmap $B$N@hF,$N(B m bytes $B$,>J$+$l$F$$$kE@(B.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2284 ;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2285 ;; o b1 ... bn ($B$D$^$j(B bitmap$B$ND9$5(B)$B$O(B, (n & 0x7f) bytes. n $B$N(B
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2286 ;; $BJ,(B 1byte $B$O4^$^$J$$(B.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2287 ;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2288 ;; o lh $B0J2<$O(B n & 0x80 $B$,(B 0 $B$J$iB8:_$7$J$$(B.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2289 ;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2290 ;; o lh $B$+$i(B ctn $B$^$G$ND9$5(B($B$D$^$j(B range table $B$ND9$5(B) $B$O(B ((lh
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2291 ;; << 8) + lo) byte. lh $B$H(B lo $B$N(B 2byte $B$r4^$`(B. ($B>e$N(B n $B$N>l(B
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2292 ;; $B9g$H0c$$$^$9$,(B, $BE}0l$7$?$[$&$,$$$$$+$J(B?).
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2293 ;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2294 ;; o cfx $B$O(B multi byte character $B$G(B, cfx $B$H(B ctx $B$N(B leading char
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2295 ;; $B$OF1$8$G$J$$$H$$$1$J$$(B. $B$^$?(B, cfx $B$N(B leading char $B$O(B 0 $B$G(B
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2296 ;; $B$"$C$F$O$$$1$J$$(B(range table $B$K(B leading char $B$,(B 0 (ASCII$B$H(B
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2297 ;; $B$+(B) $B$NJ8;z$,$"$C$F$b(B, $B8=:_$O(B fastmap $B$KH?1G$5$l$J$$$+$i(B).
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2298 ;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2299 ;;; START_MEMORY regno
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2300 ;;; STOP_MEMORY regno
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2301 ;;; o emacs 19 $B$N(B regex.c $B$G$O(B,
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2302 ;;; START_MEMORY regno groupno
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2303 ;;; STOP_MEMORY regno groupno
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2304 ;;; groupno $B$O<+J,$h$j2<$N%l%Y%k$N%0%k!<%W$N?t(B
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2305 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2306 ;;; DUPLICATE regno
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2307 ;;; BEFORE_DOT ;;; not used
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2308 ;;; AT_DOT ;;; not used
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2309 ;;; AFTER_DOT ;;; not used
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2310 ;;; BEGBUF
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2311 ;;; ENDBUF
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2312 ;;; WORDCHAR ;;; not used
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2313 ;;; NOTWORDCHAR ;;; not used
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2314 ;;; WORDBEG
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2315 ;;; WORDEND
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2316 ;;; WORDBOUND
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2317 ;;; NOTWORDBOUND
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2318 ;;; SYNTAXSPEC ch
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2319 ;;; NOTSYNTAXSPEC ch
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2320
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2321 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2322 ;;; $B3HD%L?Na!J(BTREX$B$G;HMQ$9$k$b$N!K(B
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2323 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2324 ;;; EXACT1 ch
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2325 ;;; EXACT2 ch1 ch2
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2326 ;;; EXACT3 ch1 ch2 ch3
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2327 ;;; CHARSETM m n b1 b2 .. bn
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2328 ;;; charset $B$N(B bitmaps $B$N$&$A@hF,$N(B m bytes $B$r>J$$$?$b$N(B
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2329 ;;; CHARSETM_NOT m n b1 b2 .. bn
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2330 ;;; charset_not $B$N(B bitmaps $B$N$&$A@hF,$N(B m bytes $B$r>J$$$?$b$N(B
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2331 ;;; CASEN n disp[1] disp[2] ... disp[n] l u ind[l] ... ind[u]
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2332 ;;; $B:G=i$K(B n $B8D$N(B jump relative address(2bytes) $B$,B3$-!$(B
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2333 ;;; $B<!$K(Bcharacter code l $B$+$i(B m $B$^$G$NJ,$N(Bindex(1byte)$B$,B3$/!%(B
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2334 ;;; ON_FAILURE_SUCCESS
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2335 ;;; alternative stack $B$r6u$K$7!$(Bpend $B$r(B push $B$9$k!%(B
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2336 ;;; SUCCESS
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2337 ;;; pend $B$X%8%c%s%W$9$k!%(B
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2338 ;;; POP
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2339 ;;; alternative stack $B$r(B pop $B$9$k!%(B
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2340
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2341 ;;; RANGE ch1 ch2
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2342 ;;; RANGE_A == RANGE 0xA0 0xFF
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2343
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2344
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2345 ;;; [^$B&A(B]$B&B(B\|$B&C(B $B$N0UL#!'(B
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2346 ;;; on_failure_jump L1
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2347 ;;; on_failure_jump L2
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2348 ;;; $B&A(B
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2349 ;;; pop
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2350 ;;; fail
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2351 ;;; L1: ALLCHAR
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2352 ;;; $B&B(B
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2353 ;;; L2: pop
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2354 ;;; $B&C(B
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2355
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2356 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2357 ;;; regexp-code-*
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2358 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2359
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2360 (defvar *regexp-code-buffer* (get-buffer-create " *regexp-code-buffer*"))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2361
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2362 (defun regexp-code-gen (FA)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2363 (let ((start (car FA))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2364 (table (cdr FA))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2365 (*table* (cdr FA))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2366 (*labels* nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2367 (*final* nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2368 (*counter* 0))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2369 (let ((list table))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2370 (while (and list (null *final*))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2371 (if (equal '((nil)) (cdr (car list)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2372 (setq *final* (car (car list))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2373 (setq list (cdr list))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2374 (cond((null *final*)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2375 (setq *final* (1+ (length table)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2376 (setq *counter* (1+ *final*)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2377 (t
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2378 (setq *counter* (1+ (length table)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2379 (save-excursion
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2380 (set-buffer *regexp-code-buffer*)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2381 (let ((kanji-flag nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2382 (mc-flag nil))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2383 (erase-buffer)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2384 (regexp-code-gen* start)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2385 (buffer-substring (point-min) (point-max)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2386 )))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2387
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2388 (defun regexp-code-gen* (node)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2389 (cond((= node *final*)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2390 (if (null (assoc node *labels*))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2391 (TREX-push (cons node (point)) *labels*))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2392 (insert SUCCESS))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2393 ((null (assoc node *labels*))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2394 (TREX-push (cons node (point)) *labels*)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2395 (let ((alist (cdr (assoc node *table*))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2396 (cond((equal '((nil)) alist)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2397 (insert SUCCESS))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2398 (t (regexp-code-gen-alist alist)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2399 (t
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2400 (let ((disp (- (cdr (assoc node *labels*)) (+ (point) 3))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2401 (insert JUMP
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2402 (logand disp 255)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2403 (/ (logand disp (* 255 256)) 256))))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2404
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2405 (defvar *regexp-charset-table* nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2406 (defvar *regexp-case-table* nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2407
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2408 (defun regexp-code-gen-alist (alist)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2409 (TREX-init *regexp-charset-table* (make-vector 256 nil))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2410 (TREX-init *regexp-case-table* (make-vector 256 nil))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2411 (if (eq (car (car alist)) nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2412 nil
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2413 (let ((nextalist alist)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2414 (numberkey nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2415 (point nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2416 (min 256) (max -1) (nexts nil) (nodealist nil))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2417 (cond((numberp (car (car alist)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2418 (setq numberkey t)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2419 (let ((i 0))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2420 (while (< i 256)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2421 (aset *regexp-case-table* i nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2422 (TREX-inc i)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2423
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2424 (while (and nextalist
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2425 (numberp (car (car nextalist))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2426 (let ((ch (car (car nextalist)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2427 (next (cdr (car nextalist))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2428 (let ((place (assoc next nodealist)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2429 (if place
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2430 (setcdr place
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2431 (cons ch (cdr place)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2432 (TREX-push (cons ch (list next)) nodealist)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2433 (aset *regexp-case-table* ch next)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2434 (if (< ch min) (setq min ch))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2435 (if (< max ch) (setq max ch))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2436 (if (not (TREX-memequal next nexts))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2437 (TREX-push next nexts)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2438 (setq nextalist (cdr nextalist))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2439 (t (setq nextalist (cdr alist))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2440
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2441 (if nextalist
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2442 (cond((eq (car (car nextalist)) nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2443 (insert ON_FAILURE_SUCCESS )) ;;; SUCCESS_SHORT
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2444 (t
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2445 (insert ON_FAILURE_JUMP 0 0)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2446 (setq point (point)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2447
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2448 (cond(numberkey
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2449 (cond((= min max)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2450 ;;; exact1
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2451 (regexp-code-gen-exact (list min) (car nexts)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2452
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2453 ((= (length nexts) 1)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2454 ;;; charset or charset_not
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2455 (if (= (length alist) 256)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2456 (insert EXCEPT0) ;92.10.26 by T.Saneto
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2457 (let ((not_min 256)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2458 (not_max -1)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2459 (ch 0)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2460 (mode (car nexts)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2461 (while (< ch 256)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2462 (cond((null (aref *regexp-case-table* ch))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2463 (if (< ch not_min) (setq not_min ch))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2464 (if (< not_max ch) (setq not_max ch))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2465 (TREX-inc ch))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2466 (if (<= (- not_max not_min) (- max min))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2467 (setq min not_min
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2468 max not_max
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2469 mode nil))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2470 (let ((minb (/ min 8))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2471 (maxb (1+ (/ max 8))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2472 (insert (if mode CHARSET_M CHARSET_M_NOT) minb (- maxb minb))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2473 (let ((b minb))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2474 (while (< b maxb)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2475 (let ((i 7) (bits 0))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2476 (while (<= 0 i)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2477 (if (eq (aref *regexp-case-table* (+ (* 8 b) i))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2478 mode)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2479 ;;;; bits table$B$N=g=x$O<!$NDL$j(B
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2480 (TREX-inc bits (aref [1 2 4 8 16 32 64 128] i)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2481 (TREX-dec i))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2482 (insert bits))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2483 (TREX-inc b))))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2484 (regexp-code-gen* (car nexts)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2485 (t
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2486 ;;; case
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2487 (let ((point nil))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2488 (insert CASEN)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2489 (insert (length nexts))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2490 (setq point (point))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2491 (let ((list nexts))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2492 (while list
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2493 (insert 0 0)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2494 (setq list (cdr list))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2495 (insert min max)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2496 (let ((ch min))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2497 (while (<= ch max)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2498 (if (aref *regexp-case-table* ch)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2499 (insert (1+ (TREX-find (aref *regexp-case-table* ch) nexts)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2500 (insert 0))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2501 (TREX-inc ch)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2502 (let ((list nexts))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2503 (while list
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2504 (if (null (assoc (car list) *labels*))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2505 (regexp-code-gen* (car list)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2506 (setq list (cdr list))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2507 (save-excursion
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2508 (goto-char point)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2509 (let ((list nexts))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2510 (while list
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2511 (delete-char 2)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2512 (let ((disp (- (cdr (assoc (car list) *labels*)) (+ (point) 2))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2513 (insert (logand disp 255)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2514 (/ (logand disp (* 255 256)) 256)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2515 (setq list (cdr list)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2516 ))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2517 ((eq (car (car alist)) ':epsilon)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2518 (regexp-code-gen* (cdr (car alist))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2519 (t
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2520 (let ((key (car (car alist)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2521 (next (cdr (car alist))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2522 (cond ((symbolp key)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2523 (insert (eval key)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2524 ((TREX-memequal (car key) '(CHARSET CHARSET_NOT))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2525 (let ((charset (cdr key))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2526 (min 128) (max -1)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2527 (mcbytes 0)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2528 (mcchars nil))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2529 (let ((i 0))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2530 (while (< i 256)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2531 (aset *regexp-charset-table* i nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2532 (TREX-inc i)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2533 (while charset
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2534 (cond((stringp (car charset))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2535 (cond((eq (length (car charset)) 1)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2536 (aset *regexp-charset-table* (aref (car charset) 0) t)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2537 (if (< (aref (car charset) 0) min)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2538 (setq min (aref (car charset) 0)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2539 (if (< max (aref (car charset) 0))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2540 (setq max (aref (car charset) 0)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2541 )
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2542 (t
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2543 (TREX-inc mcbytes (* 2 (length (car charset))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2544 (if (null mcchars) (setq mcchars charset))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2545 )))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2546 ((consp (car charset)) ;;; range
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2547 (cond ((eq (length (nth 1 (car charset))) 1)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2548 (let ((from (aref (nth 1 (car charset)) 0))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2549 (to (aref (nth 2 (car charset)) 0)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2550 (if (< from min) (setq min from))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2551 (if (< max to) (setq max to))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2552 (while (<= from to)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2553 (aset *regexp-charset-table* from t)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2554 (TREX-inc from)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2555 )
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2556 (t
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2557 (TREX-inc mcbytes
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2558 (+ (length (nth 1 (car charset))) (length (nth 2 (car charset)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2559 (if (null mcchars) (setq mcchars charset))))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2560 (setq charset (cdr charset)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2561 (cond ((< max min)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2562 (insert (if (eq (car key) 'CHARSET) CHARSET CHARSET_NOT)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2563 (if (< 0 mcbytes) 128 0)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2564 (t
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2565 (let ((minb (/ min 8))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2566 (maxb (1+ (/ max 8))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2567 (insert (if (eq (car key) 'CHARSET) CHARSET_M CHARSET_M_NOT)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2568 minb (+ (if (< 0 mcbytes) 128 0) (- maxb minb)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2569 (let ((b minb))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2570 (while (< b maxb)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2571 (let ((i 7) (bits 0))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2572 (while (<= 0 i)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2573 (if (aref *regexp-charset-table* (+ (* 8 b) i))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2574 ;;;; bits table$B$N=g=x$O<!$NDL$j(B
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2575 (TREX-inc bits (aref [1 2 4 8 16 32 64 128] i)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2576 (TREX-dec i))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2577 (insert bits))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2578 (TREX-inc b))))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2579
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2580 (cond( (< 0 mcbytes)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2581 (TREX-inc mcbytes 2)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2582 (insert (/ mcbytes 256) (mod mcbytes 256))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2583 (while mcchars
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2584 (cond((stringp (car mcchars))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2585 (insert (car mcchars) (car mcchars)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2586 ((consp (car mcchars))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2587 (insert (nth 1 (car mcchars)) (nth 2 (car mcchars)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2588 (setq mcchars (cdr mcchars)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2589 ))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2590 ((= (length key) 1)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2591 (insert (eval (car key))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2592 ((= (length key) 2)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2593 (insert (eval (car key)) (nth 1 key)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2594 ((= (length key) 3)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2595 (insert (eval (car key)) (nth 1 key) (nth 2 key)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2596 (t
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2597 (regexp-error)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2598 (regexp-code-gen* next))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2599 (if point
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2600 (let ((disp (- (point) point)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2601 (save-excursion
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2602 (goto-char point)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2603 (delete-char -2)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2604 (insert (logand disp 255)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2605 (/ (logand disp (* 255 256)) 256)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2606 (regexp-code-gen-alist nextalist))))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2607
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2608 (defun regexp-code-gen-exact (chars node)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2609 (let ((alist (cdr (assoc node *table*))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2610 (cond((and (null (assoc node *labels*))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2611 (= (length alist) 1)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2612 (numberp (car (car alist))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2613 (regexp-code-gen-exact (cons (car (car alist)) chars)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2614 (cdr (car alist))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2615 (t
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2616 (regexp-code-gen-exact* (reverse chars))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2617 (regexp-code-gen* node)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2618
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2619 (defun regexp-code-gen-exact* (chars)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2620 (cond((= (length chars) 1)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2621 (insert EXACT1 (car chars)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2622 ((= (length chars) 2)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2623 (insert EXACT2 (car chars) (nth 1 chars)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2624 ((= (length chars) 3)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2625 (insert EXACT3 (car chars) (nth 1 chars) (nth 2 chars)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2626 (t
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2627 (insert EXACTN (length chars))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2628 (let ((list chars))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2629 (while list
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2630 (insert (car list))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2631 (setq list (cdr list)))))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2632
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2633 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2634 ;;; regexp-code-dump
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2635 ;;; $B@55,I=8=$N%3!<%I$rI=<($9$k!%(B
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2636 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2637
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2638 (defvar *regexp-code-dump* nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2639 (defvar *regexp-code-index* nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2640
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2641 (defun regexp-code-dump (*regexp-code-dump*)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2642 (terpri)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2643 (let ((*regexp-code-index* 0)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2644 (max (length *regexp-code-dump*)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2645 (while (< *regexp-code-index* max)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2646 (princ (format "%4d:" *regexp-code-index*))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2647 (let((op (aref *regexp-code-dump* *regexp-code-index*)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2648 (cond((= op UNUSED) (regexp-code-dump-0 "unused"))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2649 ((= op EXACTN)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2650 (princ (format "exactn(%d) " (aref *regexp-code-dump* (1+ *regexp-code-index*))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2651 (let ((j (+ *regexp-code-index* 2))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2652 (max (+ *regexp-code-index* 2 (aref *regexp-code-dump* (1+ *regexp-code-index*)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2653 (while (< j max)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2654 (princ (format "%c" (aref *regexp-code-dump* j)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2655 (TREX-inc j))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2656 (setq *regexp-code-index* j))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2657 (terpri)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2658 )
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2659 ((= op BEGLINE) (regexp-code-dump-0 "begline"))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2660 ((= op ENDLINE) (regexp-code-dump-0 "endline"))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2661 ((= op JUMP) (regexp-code-dump-jump "jump"))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2662 ((and (= regexp-version 19)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2663 (= op JUMP_PAST_ALT))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2664 (regexp-code-dump-jump "jump_past_alt"))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2665 ((= op ON_FAILURE_JUMP ) (regexp-code-dump-jump "on_failure_jump"))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2666 ((and (= regexp-version 19)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2667 (= op ON_FAILURE_KEEP_STRING_JUMP))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2668 (regexp-code-dump-jump "on_failure_keep_string_jump"))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2669 ((and (= regexp-version 18)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2670 (= op FINALIZE_JUMP))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2671 (regexp-code-dump-jump "finalize_jump"))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2672 ((and (= regexp-version 18)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2673 (= op MAYBE_FINALIZE_JUMP))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2674 (regexp-code-dump-jump "maybe_finalize_jump"))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2675 ((and (= regexp-version 19)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2676 (= op POP_FAILURE_JUMP))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2677 (regexp-code-dump-jump "pop_failure_jump"))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2678 ((and (= regexp-version 19)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2679 (= op MAYBE_POP_JUMP))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2680 (regexp-code-dump-jump "maybe_pop_jump"))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2681 ((= op DUMMY_FAILURE_JUMP) (regexp-code-dump-jump "dummy_failure_jump"))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2682 ((and (= regexp-version 19)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2683 (= op PUSH_DUMMY_FAILURE))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2684 (regexp-code-dump-0 "push_dummy_failure"))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2685 ((and (= regexp-version 19)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2686 (= op SUCCEED_N))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2687 (regexp-code-dump-jump-2 "succeed_n"))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2688 ((and (= regexp-version 19)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2689 (= op JUMP_N))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2690 (regexp-code-dump-jump-2 "jump_n"))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2691 ((and (= regexp-version 19)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2692 (= op SET_NUMBER_AT))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2693 (regexp-code-dump-jump-2 "SET_NUMBER_AT"))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2694 ((= op ANYCHAR) (regexp-code-dump-0 "anychar"))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2695 ((= op CHARSET) (regexp-code-dump-charset "charset"))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2696 ((= op CHARSET_NOT) (regexp-code-dump-charset "charset_not"))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2697 ((= op START_MEMORY)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2698 (if (= regexp-version 19)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2699 (regexp-code-dump-2 "start_memory")
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2700 (regexp-code-dump-1 "start_memory")))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2701 ((= op STOP_MEMORY)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2702 (if (= regexp-version 19)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2703 (regexp-code-dump-2 "stop_memory")
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2704 (regexp-code-dump-1 "stop_memory")))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2705 ((= op DUPLICATE) (regexp-code-dump-1 "duplicate"))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2706 ((= op BEFORE_DOT) (regexp-code-dump-0 "before_dot"))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2707 ((= op AT_DOT) (regexp-code-dump-0 "at_dot"))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2708 ((= op AFTER_DOT) (regexp-code-dump-0 "after_dot"))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2709 ((= op BEGBUF) (regexp-code-dump-0 "begbuf"))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2710 ((= op ENDBUF) (regexp-code-dump-0 "endbuf"))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2711 ((= op WORDCHAR) (regexp-code-dump-0 "wordchar"))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2712 ((= op NOTWORDCHAR) (regexp-code-dump-0 "notwordchar"))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2713 ((= op WORDBEG) (regexp-code-dump-0 "wordbeg"))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2714 ((= op WORDEND) (regexp-code-dump-0 "wordend"))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2715 ((= op WORDBOUND) (regexp-code-dump-0 "wordbound"))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2716 ((= op NOTWORDBOUND) (regexp-code-dump-0 "notwordbound"))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2717 ((= op SYNTAXSPEC) (regexp-code-dump-syntax "syntaxspec"))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2718 ((= op NOTSYNTAXSPEC) (regexp-code-dump-syntax "notsyntaxspec"))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2719 ((= op EXACT1) (regexp-code-dump-1ch "EXACT1"))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2720 ((= op EXACT2)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2721 (princ (format "EXACT2 %c%c\n" (aref *regexp-code-dump* (1+ *regexp-code-index*))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2722 (aref *regexp-code-dump* (+ *regexp-code-index* 2))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2723 (TREX-inc *regexp-code-index* 3))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2724 ((= op EXACT3)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2725 (princ (format "EXACT3 %c%c%c\n"
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2726 (aref *regexp-code-dump* (1+ *regexp-code-index*))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2727 (aref *regexp-code-dump* (+ *regexp-code-index* 2))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2728 (aref *regexp-code-dump* (+ *regexp-code-index* 3))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2729 (TREX-inc *regexp-code-index* 4))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2730 ((= op CHARSET_M) (regexp-code-dump-charset-m "CHARSET_M"))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2731 ((= op CHARSET_M_NOT) (regexp-code-dump-charset-m "CHARSET_M_NOT"))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2732 ((= op CASEN)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2733 (princ (format "CASEN %d\n" (aref *regexp-code-dump* (1+ *regexp-code-index*))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2734 (let ((j (+ *regexp-code-index* 2))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2735 (max (+ *regexp-code-index* 2 (* 2 (aref *regexp-code-dump* (1+ *regexp-code-index*))))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2736 (while (< j max)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2737 (princ (format "[%d]::%d\n" (1+ (/ (- j (+ *regexp-code-index* 2)) 2))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2738 (regexp-get-absolute-address
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2739 (+ j 2) (aref *regexp-code-dump* j)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2740 (aref *regexp-code-dump* (1+ j)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2741 (TREX-inc j 2))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2742 (let ((ch (aref *regexp-code-dump* j)) (chmax (aref *regexp-code-dump* (1+ j))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2743 (princ (format "%c::%c\n" ch chmax))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2744 (TREX-inc j 2)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2745 (while (<= ch chmax)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2746 (princ (format "%c=>[%d]\n" ch (aref *regexp-code-dump* j)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2747 (TREX-inc j)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2748 (TREX-inc ch)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2749 (setq *regexp-code-index* j)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2750 ((= op ON_FAILURE_SUCCESS) (regexp-code-dump-0 "ON_FAILURE_SUCCESS"))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2751 ((= op SUCCESS) (regexp-code-dump-0 "SUCCESS"))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2752 ((= op POP) (regexp-code-dump-0 "POP"))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2753 ((= op EXCEPT0) (regexp-code-dump-0 "EXCEPT0"))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2754 ((= op EXCEPT1) (regexp-code-dump-1ch "EXCEPT1"))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2755 ((= op CATEGORYSPEC) (regexp-code-dump-1ch "CATEGORYSPEC"))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2756 ((= op NOTCATEGORYSPEC) (regexp-code-dump-1ch "NOTCATEGORYSPEC"))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2757 (t (princ (format "unknown op=%d\n" op))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2758 (TREX-inc *regexp-code-index*)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2759 (princ (format "%4d:\n" *regexp-code-index*)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2760 nil
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2761 )
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2762
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2763 (defun regexp-code-dump-0 (op)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2764 (princ op) (terpri)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2765 (TREX-inc *regexp-code-index*))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2766
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2767 (defun regexp-code-dump-1 (op)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2768 (princ (format "%s %d\n" op (aref *regexp-code-dump* (1+ *regexp-code-index*))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2769 (TREX-inc *regexp-code-index* 2))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2770
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2771 (defun regexp-code-dump-2 (op)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2772 (princ (format "%s %d %d\n"
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2773 op
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2774 (aref *regexp-code-dump* (1+ *regexp-code-index*))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2775 (aref *regexp-code-dump* (+ *regexp-code-index* 2))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2776 ))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2777 (TREX-inc *regexp-code-index* 3))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2778
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2779 (defun regexp-code-dump-syntax (op)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2780 (princ (format "%s %c\n" op (syntax-code-spec (aref *regexp-code-dump* (1+ *regexp-code-index*)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2781 (TREX-inc *regexp-code-index* 2))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2782
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2783 (defun regexp-code-dump-1ch (op)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2784 (princ (format "%s %c\n" op (aref *regexp-code-dump* (1+ *regexp-code-index*))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2785 (TREX-inc *regexp-code-index* 2))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2786
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2787 (defun regexp-get-absolute-address (point b1 b2)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2788 (cond ((< b2 128)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2789 (+ point (+ (* 256 b2) b1)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2790 (t
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2791 (+ point (logior (logxor -1 (+ (* 255 256) 255)) (* 256 b2) b1)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2792
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2793 (defun regexp-code-dump-jump (op)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2794 (let* ((b1 (aref *regexp-code-dump* (1+ *regexp-code-index*)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2795 (b2 (aref *regexp-code-dump* (+ *regexp-code-index* 2)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2796 (p (regexp-get-absolute-address (+ *regexp-code-index* 3) b1 b2)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2797 (princ (format "%s %d\n" op p)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2798 (TREX-inc *regexp-code-index* 3))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2799
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2800 (defun regexp-code-dump-jump-2 (op)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2801 (let* ((b1 (aref *regexp-code-dump* (1+ *regexp-code-index*)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2802 (b2 (aref *regexp-code-dump* (+ *regexp-code-index* 2)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2803 (p (regexp-get-absolute-address (+ *regexp-code-index* 3) b1 b2)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2804 (princ (format "%s %d %d\n" op p
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2805 (+
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2806 (* 256 (aref *regexp-code-dump* (+ *regexp-code-index* 3)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2807 (aref *regexp-code-dump* (+ *regexp-code-index* 4))))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2808 (TREX-inc *regexp-code-index* 5))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2809
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2810 (defun regexp-code-dump-charset (op)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2811 (let ((n (aref *regexp-code-dump* (1+ *regexp-code-index*))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2812 (princ (format "%s %d " op n))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2813 (let ((j (+ *regexp-code-index* 2))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2814 (max (+ *regexp-code-index* 2 (if (<= 128 n) (- n 128) n))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2815 (while (< j max)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2816 (princ (format "0x%2x " (aref *regexp-code-dump* j)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2817 (TREX-inc j))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2818 (cond((<= 128 n)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2819 (let* ((len (+ (* 256 (aref *regexp-code-dump* j))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2820 (aref *regexp-code-dump* (1+ j))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2821 (last (+ j len)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2822 (princ (format "\n range list[%d-2 bytes]" len))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2823 (TREX-inc j 2)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2824 (while (< j last)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2825 (let ((ch (sref *regexp-code-dump* j)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2826 (princ (format " %c" ch))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2827 (TREX-inc j (char-octets ch))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2828 (setq ch (sref *regexp-code-dump* j))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2829 (princ (format "-%c" ch))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2830 (TREX-inc j (char-octets ch))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2831 )))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2832 (setq *regexp-code-index* j)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2833 (terpri))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2834 ))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2835
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2836 (defun regexp-code-dump-charset-m (op)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2837 (let ((m (aref *regexp-code-dump* (1+ *regexp-code-index*)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2838 (n (aref *regexp-code-dump* (+ *regexp-code-index* 2))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2839 (princ (format "%s %d %d " op m n))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2840 (let ((j (+ *regexp-code-index* 3))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2841 (max (+ *regexp-code-index* 3 (if (<= 128 n) (- n 128) n))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2842 (while (< j max)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2843 (princ (format "0x%02x " (aref *regexp-code-dump* j)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2844 (TREX-inc j))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2845 (cond((<= 128 n)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2846 (let* ((len (+ (* 256 (aref *regexp-code-dump* j))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2847 (aref *regexp-code-dump* (1+ j))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2848 (last (+ j len)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2849 (princ (format "\n range list[%d-2 bytes]" len))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2850 (TREX-inc j 2)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2851 (while (< j last)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2852 (let ((ch (sref *regexp-code-dump* j)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2853 (princ (format " %c" ch))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2854 (TREX-inc j (char-octets ch))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2855 (setq ch (sref *regexp-code-dump* j))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2856 (princ (format "-%c" ch))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2857 (TREX-inc j (char-octets ch))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2858 )))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2859 (setq *regexp-code-index* j)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2860 (terpri)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2861 )))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2862
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2863 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2864 ;;; Compile functions
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2865 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2866
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2867 (defun TREX-simple-test1 ()
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2868 (regexp-word-compile
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2869 "\\cA+\\cH*\\|\\cK+\\cH*\\|\\cC+\\cH*\\|\\cH+\\|\\sw+"))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2870
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2871 (defun TREX-test1 (pattern)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2872 (let* ((regexp (regexp-parse pattern))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2873 (fFA (EFFA-make (FA-make regexp)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2874 (bFA (EFFA-make (FA-inverse fFA)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2875 (l (cdr fFA))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2876 (result nil))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2877 (TREX-push (cons (DFA-optimize (DFA-make fFA))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2878 (DFA-optimize (DFA-make bFA)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2879 result)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2880 (while l
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2881 (let* ((forward (NEFA-make (EFFA-make (cons (car (car l)) (cdr fFA)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2882 (backward (NEFA-make (EFFA-make (cons (car (car l)) (cdr bFA))))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2883 (cond((and forward backward)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2884 (TREX-push (cons (DFA-optimize (FA-simplify (DFA-shortest-match (DFA-make forward))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2885 (DFA-optimize (FA-simplify (DFA-shortest-match (DFA-make backward)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2886 result))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2887 (setq l (cdr l)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2888 (setq result (reverse result))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2889 (let ((count 0))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2890 (while result
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2891 (princ (format "\nForward[%2d]:" count)) (FA-dump (car (car result)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2892 (princ (format "\nBackward[%2d]:" count)) (FA-dump (cdr (car result)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2893 (TREX-inc count)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2894 (setq result (cdr result))))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2895
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2896 (defun TREX-test2 (pattern)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2897 (let* ((regexp (regexp-parse pattern))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2898 (fFA (EFFA-make (FA-make regexp)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2899 (l (cdr fFA))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2900 (result nil))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2901 (regexp-code-dump (setq result (regexp-code-gen (DFA-optimize (DFA-make fFA)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2902 result))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2903
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2904 ;;;###autoload
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2905 (defun regexp-compile (pattern)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2906 (regexp-compile-internal pattern nil))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2907
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2908 ;;;###autoload
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2909 (defun regexp-word-compile (pattern)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2910 (regexp-compile-internal pattern t))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2911
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2912 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2913 ;;; Returns a list of pair of forward-code and backward-code
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2914 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2915
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2916
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2917 (defun regexp-compile-internal (pattern &optional word)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2918 (let* ((*regexp-word-definition* word)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2919 (*regexp-parse-translate*
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2920 (if case-fold-search
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2921 ;;; DOWNCASE or CANONICAL?
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2922 (nth 2 (current-case-table))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2923 nil))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2924 (regexp (regexp-parse pattern))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2925 (fFA (EFFA-make (FA-make (regexp-reform-duplication regexp))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2926 (bFA (EFFA-make (FA-make (regexp-reform-duplication (regexp-inverse regexp)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2927 (result nil))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2928 (let ((ofFA (DFA-optimize (DFA-make fFA)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2929 (obFA (DFA-optimize (DFA-make bFA))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2930 (TREX-push (cons (DFA-code-with-fastmap ofFA)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2931 (let* ((START_MEMORY STOP_MEMORY)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2932 (STOP_MEMORY START_MEMORY))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2933 (DFA-code-with-fastmap obFA)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2934 result))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2935 (if word
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2936 (let ((l (cdr fFA))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2937 (bFA (EFFA-make (FA-inverse fFA))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2938 (while l
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2939 (let* ((forward (NEFA-make (EFFA-make (cons (car (car l)) (cdr fFA)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2940 (backward (NEFA-make (EFFA-make (cons (car (car l)) (cdr bFA))))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2941 (cond((and forward backward)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2942 (let ((fFA (DFA-optimize (FA-simplify (DFA-shortest-match (DFA-make forward)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2943 (bFA (DFA-optimize (FA-simplify (DFA-shortest-match (DFA-make backward))))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2944 (TREX-push (cons (DFA-code-with-fastmap fFA)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2945 (DFA-code-with-fastmap bFA))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2946 result)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2947 (setq l (cdr l)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2948 (setq result (nreverse result))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2949 result))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2950
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2951 (defun regexp-compiled-pattern-dump (pattern)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2952 ;;; PATTERN is a vector of [ code fastmap fastmap-syntax fastmap-categoy]
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2953 (regexp-code-dump (aref pattern 0))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2954 (print-fastmap (aref pattern 1) " fastmap[char]")
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2955 (print-fastmap (aref pattern 2) " fastmap[synt]")
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2956 (print-fastmap (aref pattern 3) " fastmap[cate]")
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2957 )
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2958
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2959 (defun regexp-compile-dump (code)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2960 (let ((Fcode (aref (car (car code)) 0))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2961 (Bcode (aref (cdr (car code)) 0))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2962 (words (cdr code)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2963 (princ (format "\nRegular Expression Compiler Dump:\n"))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2964 (princ (format "Forward Search:"))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2965 (regexp-compiled-pattern-dump (car (car code)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2966 (princ (format "Backward Search:"))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2967 (if Bcode (regexp-compiled-pattern-dump (cdr (car code)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2968 (princ (format "\n Use the interpreter\n")))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2969 (if words
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2970 (let ((i 1))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2971 (princ (format "In word conditions:\n"))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2972 (while words
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2973 (princ (format "Forward[%d]" i))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2974 (regexp-compiled-pattern-dump (car (car words)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2975 (princ (format "Backward[%d]" i))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2976 (regexp-compiled-pattern-dump (cdr (car words)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2977 (TREX-inc i)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2978 (setq words (cdr words)))))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2979
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2980 (defun regexp-compile-and-dump (regexp)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2981 (regexp-compile-dump (regexp-compile regexp)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2982
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2983
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2984 ;;;###autoload
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2985 (defmacro define-word-regexp (name regexp)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2986 (` (defconst (, name) '(, (regexp-word-compile regexp)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2987
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2988 (put 'define-word-regexp 'byte-hunk-handler ;93.7.16 by S.Tomura
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2989 'macroexpand)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2990
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2991 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2992 ;;; Coding system
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2993 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2994
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2995 (defmacro define-coding-systems (&rest rest)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2996 (` (define-coding-systems* '(, rest))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2997
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2998 (defun define-coding-systems* (names)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2999 (let ((systems
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3000 (` (:or (,@ (mapcar (function (lambda (name) (` (:seq (, (regexp-get-definition name))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3001 (, name)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3002 names))))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3003 systems))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3004
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3005 (defun oct (str) (aref str 0))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3006
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3007 (defvar *TREX-range-from* nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3008 (defvar *TREX-range-to* nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3009
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3010 (defun TREX-range-make-jisjoint (regexp)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3011 (TREX-init *TREX-range-from* (make-vector 256 nil))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3012 (TREX-init *TREX-range-to* (make-vector 256 nil))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3013 (let ((i 0))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3014 (while (< i 256)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3015 (aset *TREX-range-from* i nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3016 (aset *TREX-range-to* i nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3017 (TREX-inc i)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3018 (aset *TREX-range-from* 0 t)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3019 (aset *TREX-range-to* 255 t)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3020 (TREX-range-mark regexp)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3021 (TREX-range-replace regexp))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3022
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3023 (defun TREX-range-mark (regexp)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3024 (cond
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3025 ((consp regexp)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3026 (let ((op (car regexp)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3027 (cond((eq op ':mark)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3028 (TREX-range-mark (nth 3 regexp)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3029 ((eq op ':or)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3030 (mapcar 'TREX-range-mark (cdr regexp)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3031 ((eq op ':seq)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3032 (mapcar 'TREX-range-mark (cdr regexp)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3033 ((eq op ':optional)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3034 (TREX-range-mark (nth 1 regexp)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3035 ((eq op ':star)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3036 (TREX-range-mark (nth 1 regexp)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3037 ((eq op ':plus)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3038 (TREX-range-mark (nth 1 regexp)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3039 ((eq op ':range)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3040 (TREX-range-mark2 (nth 1 regexp) (nth 2 regexp))))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3041 ((stringp regexp)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3042 (TREX-range-mark2 regexp regexp))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3043 ((numberp regexp)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3044 (TREX-range-mark2 regexp regexp))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3045
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3046 (defun TREX-range-mark2 (from to)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3047 (if (stringp from) (setq from (aref from 0)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3048 (if (stringp to) (setq to (aref to 0)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3049 (if (< 0 from) (aset *TREX-range-to* (1- from) t))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3050 (if (< to 255) (aset *TREX-range-from* (1+ to) t))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3051 (aset *TREX-range-from* from t)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3052 (aset *TREX-range-to* to t))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3053
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3054 (defun TREX-range-replace (regexp)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3055 (cond
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3056 ((consp regexp)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3057 (let ((op (car regexp)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3058 (cond((eq op ':mark)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3059 (` (:mark (, (nth 1 regexp))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3060 (, (nth 2 regexp))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3061 (, (TREX-range-replace (nth 3 regexp))))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3062 ((eq op ':or)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3063 (` (:or (,@ (mapcar 'TREX-range-replace (cdr regexp))))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3064 ((eq op ':seq)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3065 (` (:seq (,@ (mapcar 'TREX-range-replace (cdr regexp))))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3066 ((eq op ':optional)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3067 (` (:optional (,(TREX-range-replace (nth 1 regexp))))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3068 ((eq op ':star)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3069 (` (:star (,(TREX-range-replace (nth 1 regexp))))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3070 ((eq op ':plus)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3071 (` (:plus (,(TREX-range-replace (nth 1 regexp))))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3072 ((eq op ':range)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3073 (let ((from (nth 1 regexp))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3074 (to (nth 2 regexp))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3075 i j
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3076 (result nil))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3077 (if (stringp from) (setq from (aref from 0)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3078 (if (stringp to ) (setq to (aref to 0)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3079 (setq i from
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3080 j from)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3081 (while (<= i to)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3082 (while (not (aref *TREX-range-to* j))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3083 (TREX-inc j))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3084 (if (not (= i j)) (TREX-push (` (:range (, i) (, j))) result)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3085 (TREX-push i result))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3086 (TREX-inc j)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3087 (setq i j))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3088 (if (= (length result) 1) (car result)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3089 (` (:or (,@ (nreverse result))))))))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3090 ((stringp regexp)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3091 (if (= (length regexp) 1)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3092 (aref regexp 0)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3093 regexp))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3094 ((numberp regexp)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3095 regexp)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3096 (t regexp)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3097
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3098 (defun FA-sort (FA)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3099 (let ((start (car FA))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3100 (alist (cdr FA)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3101 (setq alist (sort alist 'TREX-lessp-car))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3102 (while alist
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3103 (setcdr (car alist) (sort (cdr (car alist)) 'TREX-lessp-car))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3104 (setcdr (car alist ) (TREX-sort (cdr (car alist)) 'TREX-key-lessp 'cdr))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3105 (setq alist (cdr alist)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3106 FA))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3107
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3108 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3109 ;;; CHARSET functions:
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3110 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3111 ;;; CHARSET ::= RANGE |
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3112 ;;; (:or RANGE+) |
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3113 ;;; (:nor RANGE+)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3114 ;;; RANGE+ ::= CHAR |
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3115 ;;; (:range CHAR CHAR)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3116 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3117
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3118 (defun CHARSET-rangep (charset)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3119 (or (numberp charset)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3120 (and (consp charset) (eq (car charset) ':range))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3121
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3122 (defun CHARSET-orp (charset)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3123 (and (consp charset) (eq (car charset) ':or)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3124
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3125 (defun CHARSET-range-from (range)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3126 (if (numberp range) range
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3127 (nth 1 range)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3128
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3129 (defun CHARSET-range-to (range)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3130 (if (numberp range) range
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3131 (nth 2 range)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3132
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3133 (defun CHARSET-range-make (from to)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3134 (if (= from to) from
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3135 (list ':range from to)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3136
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3137 (defun CHARSET-membership (range charset)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3138 (let ((from (CHARSET-range-from range))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3139 (to (CHARSET-range-to range))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3140 (flag nil))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3141 (while (and charset flag1)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3142 (if (< from (CHARSET-range-from (car charset)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3143 (setq charset (cdr charset))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3144 (setq flag t)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3145 (and flag1 (<= to (CHARSET-range-to (car charset))))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3146
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3147 (defun CHARSET-not (charset)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3148 (cond((CHARSET-rangep charset)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3149 (list ':nor charset))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3150 ((CHARSET-orp charset)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3151 (cons ':nor (cdr charset)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3152 (t
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3153 (cons ':or (cdr charset)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3154
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3155 (defun CHARSET-union (charset1 charset2)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3156 (cond((CHARSET-rangep charset1)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3157 (cond ((CHARSET-rangep charset2)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3158 (CHARSET-union-range-range charset1 charset2))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3159 ((CHARSET-orp charset2)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3160 (CHARSET-union-range-or charset1 charset2))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3161 (t
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3162 (CHARSET-union-range-nor charset1 charset2))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3163 ((CHARSET-orp charset1)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3164 (cond ((CHARSET-rangep charset2)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3165 (CHARSET-union-range-or charset2 charset1))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3166 ((CHARSET-orp charset2)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3167 (CHARSET-union-or-or charset1 charset2))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3168 (t
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3169 (CHARSET-union-or-nor charset1 charset2))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3170 (t ;;; (CHARSET-norp charset1)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3171 (cond((CHARSET-rangep charset2)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3172 (CHARSET-union-range-nor charset2 charset1))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3173 ((CHARSET-orp charset2)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3174 (CHARSET-union-or-nor charset2 charset1))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3175 (t
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3176 (CHARSET-union-nor-nor charset1 charset2))))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3177
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3178 (defun CHARSET-union-range-range (range1 range2)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3179 (let ((from1 (CHARSET-range-from range1))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3180 (to1 (CHARSET-range-to range1))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3181 (from2 (CHARSET-range-from range2))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3182 (to2 (CHARSET-range-to range2)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3183 (cond((< to1 from2)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3184 (list ':or range1 range2))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3185 (t ;;; (<= from2 (1+ to1))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3186 (cond((<= to1 to2) ;;; (<= from2 to1 to2)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3187 (CHARSET-range-make (min from1 from2) to2))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3188 ((<= from1 to2) ;;; (<= from1 to2 to1)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3189 (CHARSET-range-make (min from1 from2) to1))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3190 (t ;;; (<= to2 from1 to1)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3191 (list ':or range2 range1)))))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3192
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3193 (defun CHARSET-union-range-or (range or)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3194 (cons ':or (CHARSET-union-range-or* range (cdr or))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3195
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3196 (defun CHARSET-union-range-or* (range or-body)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3197 (let ((from (CHARSET-range-from range))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3198 (to (CHARSET-range-to range))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3199 (part1 nil))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3200 (let ((flag nil))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3201 (while (and or-body (null flag))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3202 (let ((next (car or-body)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3203 (if (< (CHARSET-range-from next) from)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3204 ;;; from[i] < from
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3205 (if (< (CHARSET-range-to next) from)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3206 ;;; to[i] < from
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3207 (setq part1 (cons next part1)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3208 or-body (cdr or-body))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3209 ;;; from[i] < from <= to[i]
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3210 (setq from (CHARSET-range-from next)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3211 flag t))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3212 ;;; from <= from[1]
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3213 ;;; to[i-1] < from <= from[i]
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3214 (setq flag t)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3215 ;;; part1 < from <= from[i]
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3216 (if (and part1 (<= (1+ (CHARSET-range-to (car part1))) from))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3217 (setq from (CHARSET-range-from (car part1))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3218 part1 (cdr part1)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3219 ;;; part1 << from <= from[i]
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3220 (let ((flag nil))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3221 (while (and or-body (null flag))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3222 (let ((next (car or-body)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3223 (if (< (CHARSET-range-from next) to)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3224 ;;; from[j] < from
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3225 (if (< (CHARSET-range-to next) to)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3226 ;;; to[j] < to
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3227 (setq or-body (cdr or-body))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3228 ;;; from[j] < to <= to[j]
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3229 (setq to (CHARSET-range-to next)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3230 flag t))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3231 ;;; to <= from[1]
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3232 ;;; to[j-1] < to <= from[j]
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3233 (setq flag t)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3234 ;;; part2 < to <= from[j]
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3235 (if (and or-body (<= (CHARSET-range-from (car or-body)) (1+ to)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3236 (setq to (CHARSET-range-to (car or-body))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3237 or-body (cdr or-body)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3238 ;;; part2 <= to << from[j]
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3239 (nconc (reverse part1)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3240 (cons (CHARSET-range-make from to)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3241 or-body))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3242
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3243
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3244 (defun CHARSET-union-range-nor (range nor)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3245 (let ((from (CHARSET-range-from range))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3246 (to (CHARSET-range-to range))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3247 (nor-body (cdr nor)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3248
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3249 ))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3250
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3251 (defun CHARSET-union-or-or (or1 or2)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3252 (cons ':or (CHARSET-union-or*-or* (cdr or1) (cdr or2))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3253
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3254 (defun CHARSET-union-or*-or* (or1-body or2-body)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3255 (let ((result-body or2-body))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3256 (while or1-body
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3257 (setq result-body
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3258 (CHARSET-union-range-or* (car or1-body) result-body))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3259 (setq or1-body (cdr or1-body)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3260 result-body))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3261
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3262 (defun CHARSET-union-or-nor (or nor)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3263 )
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3264
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3265 (defun CHARSET-union-nor-nor (nor1 nor2)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3266 (cons ':nor (CHARSET-intersection-or*-or* (cdr nor1) (cdr nor2))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3267
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3268 (defun CHARSET-intersection (charset1 charset2)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3269 (cond((CHARSET-rangep charset1)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3270 (cond ((CHARSET-rangep charset2)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3271 (CHARSET-intersection-range-range charset1 charset2))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3272 ((CHARSET-orp charset2)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3273 (CHARSET-intersection-range-or charset1 charset2))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3274 (t
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3275 (CHARSET-intersection-range-nor charset1 charset2))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3276 ((CHARSET-orp charset1)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3277 (cond ((CHARSET-rangep charset2)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3278 (CHARSET-intersection-range-or charset2 charset1))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3279 ((CHARSET-orp charset2)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3280 (CHARSET-intersection-or-or charset1 charset2))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3281 (t
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3282 (CHARSET-intersection-or-nor charset1 charset2))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3283 (t ;;; (CHARSET-norp charset1)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3284 (cond((CHARSET-rangep charset2)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3285 (CHARSET-intersection-range-nor charset2 charset1))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3286 ((CHARSET-orp charset2)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3287 (CHARSET-intersection-or-nor charset2 charset1))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3288 (t
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3289 (CHARSET-intersection-nor-nor charset1 charset2))))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3290
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3291 (defun CHARSET-intersection-range-or (range or)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3292 (CHARSET-intersection-range-or* range (cdr or)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3293
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3294 (defun CHARSET-intersection-range-or* (range or-body)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3295 (let ((from (CHARSET-range-from range))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3296 (to (CHARSET-range-to range))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3297 (part2 nil))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3298 (let ((flag nil))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3299 (while (and or-body (null flag))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3300 (let ((next (car or-body)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3301 (if (< (CHARSET-range-from next) from)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3302 ;;; from[i] < from
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3303 (if (< (CHARSET-range-to next) from)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3304 ;;; to[i] < from
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3305 (setq or-body (cdr or-body))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3306 ;;; from[i] < from <= to[i]
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3307 (setq flag t))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3308 ;;; from <= from[1]
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3309 ;;; to[i-1] < from <= from[i]
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3310 (setq flag t)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3311 ;;; from[i] < from <= to[i]
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3312 ;;; from <= from[1]
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3313 ;;; to[i-1] < from <= from[i]
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3314 (let ((flag nil))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3315 (while (and or-body (null flag))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3316 (let ((next (car or-body)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3317 (if (<= (CHARSET-range-from next) to)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3318 ;;; from[j] <= to
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3319 (if (<= (CHARSET-range-to next) to)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3320 ;;; to[j] <= to
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3321 (setq part2 (cons next part2)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3322 or-body (cdr or-body))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3323 ;;; from[j] <= to < to[j]
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3324 (setq part2 (cons next part2)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3325 or-body (cdr or-body)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3326 flag t)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3327 ;;; to < from[1]
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3328 ;;; to[j-1] <= to < from[j]
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3329 (setq flag t)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3330 ;;; from[j] <= to < to[j]
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3331 ;;; to < from[1]
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3332 ;;; to[j-1] <= to < from[j]
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3333 (cond ((null part2) nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3334 ((= (length part2) 1)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3335 (list (CHARSET-range-make (max from (CHARSET-range-from (car part2)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3336 (min to (CHARSET-range-to (car part2))))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3337 (t
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3338 (setcar part2 (CHARSET-range-make (CHARSET-range-from (car part2))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3339 (min to (CHARSET-range-to (car part2)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3340 (setq part2 (nreverse part2))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3341 (setcar part2 (CHARSET-range-make (max from (CHARSET-range-from (car part2)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3342 (CHARSET-range-to (car part2))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3343 part2)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3344
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3345 (defun CHARSET-intersection-range-nor (range nor)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3346 (CHARSET-intersection-range-nor* range (cdr nor)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3347
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3348 (defun CHARSET-intersecion-range-nor* (range nor-body)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3349 (let ((from (CHARSET-range-from range))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3350 (to (CHARSET-range-to range)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3351 ))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3352
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3353 ;;; (and (or a b) c) == (or (and a c) (and b c))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3354
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3355 (defun CHARSET-intersection-or-or (or1 or2)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3356 (let ((result nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3357 (or1-body (cdr or1))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3358 (or2-body (cdr or2)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3359 (while or1-body
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3360 (setq result (CHARSET-union-or*-or*
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3361 (CHARSET-intersection-range-or* (car or1-body) or2-body)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3362 result))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3363 (setq or1-body (cdr or1-body)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3364 (if (= (length result) 1) (car result)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3365 (cons ':or result))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3366
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3367 (defun CHARSET-intersection-or-nor (or nor)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3368 )
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3369
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3370 ;;; (and (not or1) (not or2)) == (not (or or1 or2))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3371
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3372 (defun CHARSET-intersection-nor-nor (nor1 nor2)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3373 (cons ':nor (CHARSET-union-or*-or* (cdr nor1) (cdr nor2))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3374
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3375 (defun FA-compaction (FA)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3376 (let ((start (car FA))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3377 (alist (cdr FA)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3378 (setq alist (TREX-sort alist 'TREX-key-lessp 'car))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3379 (while alist
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3380 (let ((table (cdr (car alist)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3381 (newtable nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3382 (keys nil) (next nil))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3383 (setq table (TREX-sort table '< 'car))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3384 (while table
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3385 (setq next (cdr (car table)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3386 (TREX-push (car (car table)) keys)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3387 (setq table (cdr table))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3388 (while (and table (eq next (cdr (car table))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3389 (TREX-push (car (car table)) keys)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3390 (setq table (cdr table)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3391 (setq keys (reverse (sort keys 'TREX-key-lessp)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3392 (let ((newkeys nil))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3393 (setq newkeys (car keys)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3394 keys (cdr keys))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3395 (while keys
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3396 (cond((numberp (car keys))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3397 (cond((numberp (car newkeys))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3398 (if (= (1+ (car keys)) (car newkeys))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3399 (setcar newkeys (list ':range (car keys) (car newkeys)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3400 (TREX-push (car keys) newkeys)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3401 ((and (consp (car newkeys)) (eq (car (car newkeys)) ':range)))))))))))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3402
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3403
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3404
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3405 (defun FA-dump2 (table)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3406 (let ((start (car table))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3407 (l (cdr table)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3408 (princ (format "\nstart = %d\n" start))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3409 (while l
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3410 (princ (format "%3d: " (car (car l))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3411 (let ((alist (cdr (car l))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3412 (cond ((numberp (car (car alist)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3413 (princ (format "\\%03o(%c) -> %s\n" (car (car alist))(car (car alist)) (cdr (car alist)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3414 ((and (consp (car (car alist))) (TREX-memequal (car (car (car alist))) '(CATEGORYSPEC NOTCATEGORYSPEC)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3415 (princ (format "(%s %c) -> %s\n" (car (car (car alist))) (nth 1 (car (car alist))) (cdr (car alist)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3416 ((and (consp (car (car alist))) (eq (car (car (car alist))) ':range))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3417 (princ (format "(:range \\%03o \\%03o) -> %s\n"
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3418 (nth 1 (car (car alist))) (nth 2 (car (car alist)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3419 (cdr (car alist)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3420 (t
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3421 (princ (format "%s -> %s\n" (car (car alist)) (cdr (car alist))))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3422 (setq alist (cdr alist))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3423 (while alist
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3424 (cond ((numberp (car (car alist)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3425 (princ (format " \\%03o(%c) -> %s\n" (car (car alist))(car (car alist)) (cdr (car alist)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3426 ((and (consp (car (car alist))) (TREX-memequal (car (car (car alist))) '(CATEGORYSPEC NOTCATEGORYSPEC)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3427 (princ (format " (%s %c) -> %s\n" (car (car (car alist))) (nth 1 (car (car alist))) (cdr (car alist)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3428 ((and (consp (car (car alist))) (eq (car (car (car alist))) ':range))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3429 (princ (format " (:range \\%03o \\%03o) -> %s\n"
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3430 (nth 1 (car (car alist))) (nth 2 (car (car alist)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3431 (cdr (car alist)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3432 (t
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3433 (princ (format " %s -> %s\n" (car (car alist)) (cdr (car alist))))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3434 (setq alist (cdr alist))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3435 (setq l (cdr l)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3436
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3437 ;;;function re-compile REGEXP
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3438 ;;;Compile REGEXP by GNU Emacs original regexp compiler,
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3439 ;;;and return information of the compiled code by a vector of length 11:
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3440 ;;; [ COMPILED-PATTERN (string)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3441 ;;; RE-NSUB REGS-ALLOCATED CAN-BE-NULL NEWLINE-ANCHOR (integers)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3442 ;;; NO-SUB NOT-BOL NOT-EOL SYNTAX (integers)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3443 ;;; FASTMAP TRANSLATE (string) ].
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3444 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3445
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3446 (defun print-compiled-pattern (compiled-code)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3447 (let ((compiled-pattern (aref compiled-code 0))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3448 (re-nsub (aref compiled-code 1))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3449 (regs-allocated (aref compiled-code 2))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3450 (can-be-null (aref compiled-code 3))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3451 (newline-anchor (aref compiled-code 4))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3452 (no-sub (aref compiled-code 5))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3453 (not-bol (aref compiled-code 6))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3454 (not-eol (aref compiled-code 7))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3455 (syntax (aref compiled-code 8))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3456 (fastmap (aref compiled-code 9))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3457 (translate (aref compiled-code 10)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3458 (regexp-code-dump compiled-pattern)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3459 ;;; fastmap
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3460 (if fastmap (print-fastmap fastmap "fastmap"))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3461 (princ (format "re_nsub: %d\n" re-nsub))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3462 (princ (format "regs-alloc: %d\n" regs-allocated))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3463 (princ (format "can-be-null: %d\n" can-be-null))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3464 (princ (format "newline-anchor: %d\n" newline-anchor))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3465 (princ (format "no-sub: %d\n" no-sub))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3466 (princ (format "not-bol: %d\n" not-bol))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3467 (princ (format "not-eol: %d\n" not-eol))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3468 (princ (format "syntax: %d\n" syntax))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3469 (if translate (print-translate translate))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3470 ;;; translate
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3471 nil
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3472 ))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3473
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3474 (defun print-fastmap (fastmap name)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3475 (if fastmap
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3476 (progn
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3477 (princ (format "%s:[" name))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3478 (let ((max (length fastmap))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3479 (i 0))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3480 (while (< i max)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3481 (if (not (= (aref fastmap i) 0))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3482 (princ (format "%c" i)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3483 (setq i (1+ i))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3484 (princ "]\n"))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3485
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3486 (defun print-translate (trans)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3487 (if trans
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3488 (progn
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3489 (princ "translate:\n")
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3490 (let ((max (length trans))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3491 (i 0))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3492 (while (< i max)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3493 (if (not (= (aref trans i) i))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3494 (princ (format " %c --> %c" i (aref trans i))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3495 (setq i (1+ i))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3496 (princ "\n"))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3497
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3498 (defun re-compile-and-dump (regexp)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3499 (print-compiled-pattern (re-compile regexp)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3500
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3501
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3502
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3503
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3504
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3505