You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
br-parser-tools/collects/parser-tools/examples/read.ss

219 lines
6.3 KiB
Scheme

#cs
(module read mzscheme
(require (lib "lex.ss" "parser-tools")
(lib "util.ss" "parser-tools"))
(define scheme-lexer
(lexer
[(: (whitespace) (comment)) (scheme-lexer lex-buf)]
["#t" #t]
["#f" #f]
[(@ "#\\" (any)) (caddr (string->list (get-lexeme)))]
["#\\space" #\space]
["#\\newline" #\newline]
[(: (@ (initial) (* (subsequent))) + - "...") (string->symbol (get-lexeme))]
[#\" (list->string (get-string-token lex-buf))]
[#\( (make-OPEN-LIST)]
[#\) (make-CLOSE)]
["#(" (make-OPEN-VECTOR)]
[(num2) (string->number (get-lexeme) 2)]
[(num8) (string->number (get-lexeme) 8)]
[(num10) (string->number (get-lexeme) 10)]
[(num16) (string->number (get-lexeme) 16)]
["'" (make-QUOTE)]
["`" (make-QUASI-QUOTE)]
["," (make-UNQUOTE)]
[",@" (make-UNQUOTE-SPLICING)]
["." (make-DOT)]
[(eof) eof]))
(define get-string-token
(lexer
[(^ #\" #\\) (cons (car (string->list (get-lexeme)))
(get-string-token lex-buf))]
[(@ #\\ #\\) (cons #\\ (get-string-token lex-buf))]
[(@ #\\ #\") (cons #\" (get-string-token lex-buf))]
[#\" null]))
(define-lex-abbrevs
[initial (: (letter) ! $ % & * / : < = > ? ^ _ ~)]
[subsequent (: (initial) (digit) + - #\. @)]
[comment (@ #\; (* (^ #\newline)) #\newline)]
; [numR (@ (prefixR) (complexR))]
; [complexR (: (realR)
; (@ (realR) @ (realR))
; (@ (realR) + (urealR) i)
; (@ (realR) - (urealR) i)
; (@ (realR) + i)
; (@ (realR) - i)
; (@ + (urealR) i)
; (@ - (urealR) i)
; (@ + i)
; (@ - i))]
; [realR (@ (sign) (urealR))]
; [urealR (: (uintegerR) (@ (uintegerR) / (uintegerR)) (decimalR))]
; [uintegerR (@ (+ (digitR)) (* #\#))]
; [prefixR (: (@ (radixR) (exactness))
; (@ (exactness) (radixR)))]
; [numR (@ (prefixR) (complexR))]
; [complexR (: (realR)
; (@ (realR) @ (realR))
[num2 (@ (prefix2) (complex2))]
[complex2 (: (real2)
(@ (real2) @ (real2))
(@ (real2) + (ureal2) i)
(@ (real2) - (ureal2) i)
(@ (real2) + i)
(@ (real2) - i)
(@ + (ureal2) i)
(@ - (ureal2) i)
(@ + i)
(@ - i))]
[real2 (@ (sign) (ureal2))]
[ureal2 (: (uinteger2) (@ (uinteger2) / (uinteger2)))]
[uinteger2 (@ (+ (digit2)) (* #\#))]
[prefix2 (: (@ (radix2) (exactness))
(@ (exactness) (radix2)))]
[radix2 "#b"]
[digit2 (: #\0 #\1)]
[num8 (@ (prefix8) (complex8))]
[complex8 (: (real8)
(@ (real8) @ (real8))
(@ (real8) + (ureal8) i)
(@ (real8) - (ureal8) i)
(@ (real8) + i)
(@ (real8) - i)
(@ + (ureal8) i)
(@ - (ureal8) i)
(@ + i)
(@ - i))]
[real8 (@ (sign) (ureal8))]
[ureal8 (: (uinteger8) (@ (uinteger8) / (uinteger8)))]
[uinteger8 (@ (+ (digit8)) (* #\#))]
[prefix8 (: (@ (radix8) (exactness))
(@ (exactness) (radix8)))]
[radix8 "#o"]
[digit8 (- #\0 #\7)]
[num10 (@ (prefix10) (complex10))]
[complex10 (: (real10)
(@ (real10) @ (real10))
(@ (real10) + (ureal10) i)
(@ (real10) - (ureal10) i)
(@ (real10) + i)
(@ (real10) - i)
(@ + (ureal10) i)
(@ - (ureal10) i)
(@ + i)
(@ - i))]
[real10 (@ (sign) (ureal10))]
[ureal10 (: (uinteger10) (@ (uinteger10) / (uinteger10)) (decimal10))]
[uinteger10 (@ (+ (digit10)) (* #\#))]
[prefix10 (: (@ (radix10) (exactness))
(@ (exactness) (radix10)))]
[radix10 (: (@) "#d")]
[digit10 (digit)]
[decimal10 (: (@ (uinteger10) (suffix))
(@ #\. (+ (digit10)) (* #\#) (suffix))
(@ (+ (digit10)) #\. (* (digit10)) (* #\#) (suffix))
(@ (+ (digit10)) (+ #\#) #\. (* #\#) (suffix)))]
[num16 (@ (prefix16) (complex16))]
[complex16 (: (real16)
(@ (real16) @ (real16))
(@ (real16) + (ureal16) i)
(@ (real16) - (ureal16) i)
(@ (real16) + i)
(@ (real16) - i)
(@ + (ureal16) i)
(@ - (ureal16) i)
(@ + i)
(@ - i))]
[real16 (@ (sign) (ureal16))]
[ureal16 (: (uinteger16) (@ (uinteger16) / (uinteger16)))]
[uinteger16 (@ (+ (digit16)) (* #\#))]
[prefix16 (: (@ (radix16) (exactness))
(@ (exactness) (radix16)))]
[radix16 "#x"]
[digit16 (: (digit) (- #\a #\f) (- #\A #\F))]
[suffix (: (@) (@ (exponent-marker) (sign) (+ (digit10))))]
[exponent-marker (: e s f d l)]
[sign (: (@) + -)]
[exactness (: (@) "#i" "#e")]
)
(define r (build-reader scheme-lexer))
(provide r)
(define (compare s1 s2)
(for-each (lambda (x y)
(if (not (equal? x y))
(printf "~a~n~n~a" x y)))
s1 s2))
(define (read-all read)
(lambda (ip)
(let ((r (read ip)))
(cond
((eof-object? r)
null)
(else
(cons r ((read-all read) ip)))))))
(define (lex-all lexer)
(lambda (in)
(let ((lb (make-lex-buf in)))
(let loop ((t (lexer lb)))
(if (not (eof-object? t))
(loop (lexer lb)))))))
(require (lib "list.ss"))
(define files (filter (lambda (x)
(string=? ".scm"
(substring x
(- (string-length x) 4)
(string-length x))))
(directory-list)))
(define (test)
(printf "just lexing~n")
(time
(map (lambda (x)
(display x)
(newline)
(call-with-input-file x (lex-all scheme-lexer)))
files))
#|
(printf "reading~n")
(time
(map (lambda (x)
(display x)
(newline)
(call-with-input-file x (read-all r)))
files))
(printf "builtin read~n")
(time
(map (lambda (x)
(display x)
(newline)
(call-with-input-file x (read-all read)))
files))
(printf "testing~n")
(for-each (lambda (x)
(display x)
(newline)
(compare (call-with-input-file x (read-all read ))
(call-with-input-file x (read-all r))))
files)|#)
(provide test)
)