Pauan

Racket regexp literal syntax

Nov 29th, 2011
327
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scheme 2.35 KB | None | 0 0
  1. (define (read-hex-char in)
  2.   (let ((c (peek-char in)))
  3.     (case c
  4.       [(#\0 #\1 #\2 #\3 #\4
  5.         #\5 #\6 #\7 #\8 #\9
  6.         #\a #\A #\b #\B #\c #\C
  7.         #\d #\D #\e #\E #\f #\F) (read-char in)]
  8.       [else (read-regexp-literal in)
  9.             (raise-syntax-error #f "not a hexadecimal character" c)])))
  10.  
  11. (define (read-hex-escape in)
  12.   (let* ([a (read-hex-char in)]
  13.          [b (read-hex-char in)])
  14.     (read (open-input-string (string #\# #\\ #\u a b)))))
  15.  
  16. (define (read-unicode-escape in)
  17.   (let* ([a (read-hex-char in)]
  18.          [b (read-hex-char in)]
  19.          [c (read-hex-char in)]
  20.          [d (read-hex-char in)])
  21.     (read (open-input-string (string #\# #\\ #\u a b c d)))))
  22.  
  23. (define (read-regexp-literal in)
  24.   (let ([ch (read-char in)])
  25.     (case ch
  26.       [(#\\) (let ([next (read-char in)])
  27.                (case next
  28.                  [(#\/) (cons next
  29.                               (read-regexp-literal in))]
  30.                  [(#\x) (cons (read-hex-escape in)
  31.                               (read-regexp-literal in))]
  32.                  [(#\u) (cons (read-unicode-escape in)
  33.                               (read-regexp-literal in))]
  34.                  [(#\n) (cons #\newline (read-regexp-literal in))]
  35.                  [(#\r) (cons #\return  (read-regexp-literal in))]
  36.                  [(#\t) (cons #\tab     (read-regexp-literal in))]
  37.                  [(#\a) (cons #\u07     (read-regexp-literal in))]
  38.                  [(#\e) (cons #\u1B     (read-regexp-literal in))]
  39.                  [(#\f) (cons #\u0C     (read-regexp-literal in))]
  40.                  [(#\v) (cons #\u0B     (read-regexp-literal in))]
  41.                  [else  (list* ch next  (read-regexp-literal in))]))]
  42.       [(#\/) null]
  43.       [else  (cons ch (read-regexp-literal in))])))
  44.  
  45.  
  46. (define (regexp-literal-readtable ch port src line col pos)
  47.   (let* ([a (read-char port)]
  48.          [b (read-char port)])
  49.     (cond ((and (eq? a #\x) (eq? b #\/))
  50.             (pregexp (apply string (read-regexp-literal port))))
  51.           ((and (eq? a #\x) (eq? b #\"))
  52.                     ;; TODO: should this be read or read/recursive?
  53.            (pregexp (read/recursive port b #f #f)))
  54.          (else
  55.            (raise-syntax-error #f "unknown #p syntax" (string a b))))))
  56.  
  57. (current-readtable
  58.  (make-readtable (current-readtable)
  59.    #\p 'dispatch-macro regexp-literal-readtable))
Advertisement
Add Comment
Please, Sign In to add comment