summaryrefslogtreecommitdiff
path: root/module
diff options
context:
space:
mode:
authorEkaitz Zarraga <ekaitz@elenq.tech>2024-12-22 21:01:06 +0100
committerLudovic Courtès <ludo@gnu.org>2024-12-22 22:14:04 +0100
commitc86a48a92f65ea499cc5becfb24c0de5ee23e035 (patch)
tree9692dfb09b0ef42c4daec085dfb6fada2253cac1 /module
parentc2829e4a86d6fc72520930825bd44900d876db1d (diff)
downloadguile-c86a48a92f65ea499cc5becfb24c0de5ee23e035.tar.gz
PEG: string-peg: Fix [^...] interpretation.
* module/ice-9/peg/string-peg.scm (NotInClass->defn): Adjust. Signed-off-by: Ludovic Courtès <ludo@gnu.org>
Diffstat (limited to 'module')
-rw-r--r--module/ice-9/peg/string-peg.scm16
1 files changed, 12 insertions, 4 deletions
diff --git a/module/ice-9/peg/string-peg.scm b/module/ice-9/peg/string-peg.scm
index 0026f8930..745d8e8e7 100644
--- a/module/ice-9/peg/string-peg.scm
+++ b/module/ice-9/peg/string-peg.scm
@@ -301,11 +301,19 @@ EndOfFile < !.
(define (Literal->defn lst for-syntax)
(apply string (map (lambda (x) (Char->defn x for-syntax)) (cdr lst))))
-;; (NotInClass ...)
-;; `-> (and ...)
+;; (NotInClass (Range ...) (Range ...))
+;; `-> (and (followed-by (not-in-range ...))
+;; (followed-by (not-in-range ...))
+;; ...
+;; (not-in-range ...))
+;; NOTE: the order doesn't matter, because all `not-in-range`s will always
+;; parse exactly one character, but all the elements but the last need not to
+;; consume the input.
(define (NotInClass->defn lst for-syntax)
- #`(and #,@(map (lambda (x) (NotInRange->defn x for-syntax))
- (cdr lst))))
+ #`(and
+ #,@(map (lambda (x) #`(followed-by #,(NotInRange->defn x for-syntax)))
+ (cddr lst))
+ #,(NotInRange->defn (cadr lst) for-syntax)))
;; (Class ...)
;; `-> (or ...)