From da16a5ef7a63bc572ec25501c40eb1cba501d2b3 Mon Sep 17 00:00:00 2001 From: Abdulaziz Ghuloum Date: Wed, 7 Nov 2007 11:24:18 -0500 Subject: [PATCH] * reader now recognizes all standard character names: #\nul #\alaram #\backspace ... #\delete --- scheme/ikarus.reader.ss | 47 +++++++++++++++++++++++++++++++++++------ scheme/run-tests.ss | 1 + scheme/tests/reader.ss | 32 +++++++++++++++++++++++++--- 3 files changed, 70 insertions(+), 10 deletions(-) diff --git a/scheme/ikarus.reader.ss b/scheme/ikarus.reader.ss index 77210ff..903e82a 100644 --- a/scheme/ikarus.reader.ss +++ b/scheme/ikarus.reader.ss @@ -190,15 +190,48 @@ (cond [(eof-object? c) (error 'tokenize "invalid #\\ near end of file")] - [($char= #\s c) - (tokenize-char-seq p "space" '(datum . #\space))] - [($char= #\n c) - (tokenize-char-seq p "newline" '(datum . #\newline))] - [($char= #\t c) + [(eqv? #\n c) + (let ([c (read-char p)]) + (cond + [(eof-object? c) + (error 'tokenize "invalid eof inside character syntax")] + [(eqv? #\u c) + (tokenize-char-seq p "ul" + (cons 'datum (integer->char 0)))] + [(eqv? #\e c) + (tokenize-char-seq p "ewline" + (cons 'datum (integer->char #xA)))] + [else + (error 'tokenize "invalid syntax" + (string #\# #\\ #\n c))]))] + [(eqv? #\a c) + (tokenize-char-seq p "alarm" + (cons 'datum (integer->char 7)))] + [(eqv? #\b c) + (tokenize-char-seq p "backspace" + (cons 'datum (integer->char 8)))] + [(eqv? #\t c) (tokenize-char-seq p "tab" '(datum . #\tab))] - [($char= #\r c) + [(eqv? #\l c) + (tokenize-char-seq p "linefeed" + (cons 'datum (integer->char #xA)))] + [(eqv? #\v c) + (tokenize-char-seq p "vtab" + (cons 'datum (integer->char #xB)))] + [(eqv? #\p c) + (tokenize-char-seq p "page" + (cons 'datum (integer->char #xC)))] + [(eqv? #\r c) (tokenize-char-seq p "return" '(datum . #\return))] - [($char= #\x c) + [(eqv? #\e c) + (tokenize-char-seq p "esc" + (cons 'datum (integer->char #x1B)))] + [(eqv? #\s c) + (tokenize-char-seq p "space" '(datum . #\space))] + [(eqv? #\d c) + (tokenize-char-seq p "delete" + (cons 'datum (integer->char #x7F)))] + [(eqv? #\x c) (let ([n (peek-char p)]) (cond [(or (eof-object? n) (delimiter? n)) diff --git a/scheme/run-tests.ss b/scheme/run-tests.ss index c4099d7..20fee6f 100755 --- a/scheme/run-tests.ss +++ b/scheme/run-tests.ss @@ -44,6 +44,7 @@ (printf "[exact-integer-sqrt] Happy Happy Joy Joy\n")) (test-reader) +(test-char-syntax) (test-bytevectors) (test-strings) (test-exact-integer-sqrt) diff --git a/scheme/tests/reader.ss b/scheme/tests/reader.ss index 48bae97..0820f75 100644 --- a/scheme/tests/reader.ss +++ b/scheme/tests/reader.ss @@ -1,5 +1,5 @@ (library (tests reader) - (export test-reader) + (export test-reader test-char-syntax) (import (ikarus) (tests framework)) (define t @@ -71,7 +71,33 @@ "#O+23761236721631263126371263712" "#O+0" "#O-0" - "#O0" + "#O0") + + (define-tests test-char-syntax + [(lambda (x) (= (char->integer x) #x0)) + (read (open-input-string "#\\nul"))] + [(lambda (x) (= (char->integer x) #x7)) + (read (open-input-string "#\\alarm"))] + [(lambda (x) (= (char->integer x) #x8)) + (read (open-input-string "#\\backspace"))] + [(lambda (x) (= (char->integer x) #x9)) + (read (open-input-string "#\\tab"))] + [(lambda (x) (= (char->integer x) #xA)) + (read (open-input-string "#\\linefeed"))] + [(lambda (x) (= (char->integer x) #xA)) + (read (open-input-string "#\\newline"))] + [(lambda (x) (= (char->integer x) #xB)) + (read (open-input-string "#\\vtab"))] + [(lambda (x) (= (char->integer x) #xC)) + (read (open-input-string "#\\page"))] + [(lambda (x) (= (char->integer x) #xD)) + (read (open-input-string "#\\return"))] + [(lambda (x) (= (char->integer x) #x1B)) + (read (open-input-string "#\\esc"))] + [(lambda (x) (= (char->integer x) #x20)) + (read (open-input-string "#\\space"))] + [(lambda (x) (= (char->integer x) #x7F)) + (read (open-input-string "#\\delete"))]) - )) + )