~ chicken-core (chicken-5) f3541ae9a5739f6b9a3a994507eaf04d2320220e
commit f3541ae9a5739f6b9a3a994507eaf04d2320220e
Author: Peter Bex <peter@more-magic.net>
AuthorDate: Mon Jul 5 15:27:32 2021 +0200
Commit: felix <felix@call-with-current-continuation.org>
CommitDate: Mon Jul 5 22:00:14 2021 +0200
Update irregex to upstream b3116764 (fc1adacb) to fix issue with "or"
When compiling an NFA from a SRE object containing an (or) which
contains an empty sequence, the resulting state machine would be
invalid, causing a crash when trying to convert it to a DFA.
This was due a mismatch in internal bookkeeping between state
numbers and the actual state transitions.
Signed-off-by: felix <felix@call-with-current-continuation.org>
diff --git a/irregex-core.scm b/irregex-core.scm
index a8e7c97f..f86b7992 100644
--- a/irregex-core.scm
+++ b/irregex-core.scm
@@ -2563,7 +2563,7 @@
flags
next))))
(and a
- (let ((c (add-state! (new-state-number a)
+ (let ((c (add-state! (new-state-number (max a b))
'())))
(nfa-add-epsilon! buf c a #f)
(nfa-add-epsilon! buf c b #f)
diff --git a/tests/test-irregex.scm b/tests/test-irregex.scm
index f1aefc21..5cf5b685 100644
--- a/tests/test-irregex.scm
+++ b/tests/test-irregex.scm
@@ -567,6 +567,15 @@
;; irregex-flags, irregex-lengths
)
+(test-group "SRE representation edge cases"
+ ;; NFA compilation skipped alternative after empty sequence (#26, found by John Clements)
+ (test-equal "empty sequence in \"or\""
+ ""
+ (irregex-match-substring (irregex-search `(or (seq) "foo") "")))
+ (test-equal "alternative to empty sequence in \"or\""
+ "foo"
+ (irregex-match-substring (irregex-search `(or (seq) "foo") "foo"))))
+
(test-end)
Trap