diff options
author | Ekaitz Zarraga <ekaitz@elenq.tech> | 2024-12-22 21:01:06 +0100 |
---|---|---|
committer | Ludovic Courtès <ludo@gnu.org> | 2024-12-22 22:14:04 +0100 |
commit | c86a48a92f65ea499cc5becfb24c0de5ee23e035 (patch) | |
tree | 9692dfb09b0ef42c4daec085dfb6fada2253cac1 /module | |
parent | c2829e4a86d6fc72520930825bd44900d876db1d (diff) | |
download | guile-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.scm | 16 |
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 ...) |