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:
olin-shivers 2001-03-07 16:46:09 +00:00
parent a723d15160
commit 5e769973cd
1 changed files with 3 additions and 9 deletions

View File

@ -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