1#lang racket/base 2(require "config.rkt" 3 "special.rkt" 4 "wrap.rkt" 5 "readtable.rkt" 6 "consume.rkt" 7 "accum-string.rkt" 8 "error.rkt" 9 "string.rkt") 10 11(provide read-regexp) 12 13(define (read-regexp mode-c accum-str in config) 14 (define c3 (read-char/special in config)) 15 (define no-wrap-config (disable-wrapping config)) 16 17 (define rx 18 (case c3 19 [(#\") 20 (accum-string-abandon! accum-str config) 21 (define str (read-string in no-wrap-config)) 22 (catch-and-reraise-as-reader 23 in config 24 ((if (char=? mode-c #\r) regexp pregexp) str))] 25 [(#\#) 26 (accum-string-add! accum-str c3) 27 (define c4 (read-char/special in config)) 28 (case c4 29 [(#\") 30 (accum-string-abandon! accum-str config) 31 (define bstr 32 (read-string in no-wrap-config #:mode '|byte string|)) 33 (catch-and-reraise-as-reader 34 in config 35 ((if (char=? mode-c #\r) byte-regexp byte-pregexp) bstr))] 36 [else 37 (reader-error in config #:due-to c4 38 "expected `\"` after `~a`" 39 (accum-string-get! accum-str config))])] 40 [else 41 (reader-error in config #:due-to c3 42 "expected `\"` or `#` after `~a`" 43 (accum-string-get! accum-str config))])) 44 45 (wrap rx 46 in 47 config 48 #f)) 49