Fixed a bug in re-dsm. It pushed a pre-dsm value inside a submatch record --
but the submatch pre-dsm field describes deleted submatches occuring *after* the indicated submatch and *before* the submatch's body. So this "simplification" was swapping the order of these deleted submatches with the live submatch, throwing off the ordering. -Olin
This commit is contained in:
parent
a723d15160
commit
5e769973cd
|
@ -41,7 +41,7 @@
|
||||||
(re-tsm (re-dsm:body re))))) ; minus body's submatches.
|
(re-tsm (re-dsm:body re))))) ; minus body's submatches.
|
||||||
|
|
||||||
;;; Slightly smart DSM constructor:
|
;;; Slightly smart DSM constructor:
|
||||||
;;; - Absorb this DSM into an inner dsm, or submatch.
|
;;; - Absorb this DSM into an inner dsm.
|
||||||
;;; - Punt unnecessary DSM's.
|
;;; - Punt unnecessary DSM's.
|
||||||
|
|
||||||
(define (re-dsm body pre-dsm post-dsm)
|
(define (re-dsm body pre-dsm post-dsm)
|
||||||
|
@ -49,14 +49,8 @@
|
||||||
(receive (body1 pre-dsm1) (open-dsm body)
|
(receive (body1 pre-dsm1) (open-dsm body)
|
||||||
(let ((pre-dsm (+ pre-dsm pre-dsm1)))
|
(let ((pre-dsm (+ pre-dsm pre-dsm1)))
|
||||||
|
|
||||||
(? ((= tsm (re-tsm body1)) body1) ; Trivial DSM
|
(if (= tsm (re-tsm body1)) body1 ; Trivial DSM
|
||||||
|
(%make-re-dsm body1 pre-dsm tsm)))))) ; Non-trivial DSM
|
||||||
((re-submatch? body1) ; Absorb into submatch.
|
|
||||||
(%make-re-submatch (re-submatch:body body1)
|
|
||||||
(+ pre-dsm (re-submatch:pre-dsm body1))
|
|
||||||
tsm))
|
|
||||||
|
|
||||||
(else (%make-re-dsm body1 pre-dsm tsm))))))) ; Non-trivial DSM
|
|
||||||
|
|
||||||
;;; Take a regexp RE and return an equivalent (re', pre-dsm) pair of values.
|
;;; Take a regexp RE and return an equivalent (re', pre-dsm) pair of values.
|
||||||
;;; Recurses into DSM records. It is the case that
|
;;; Recurses into DSM records. It is the case that
|
||||||
|
|
Loading…
Reference in New Issue