From 5afd1b4118f1033aaac13c91f21906116e76875b Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Thu, 28 Mar 2013 20:35:23 -0600 Subject: [PATCH] syntax-color/racket-lexer: update for single-precision and extflonums Includes a doc fix to note `+inf.t', etc. --- .../scribblings/reference/extflonums.scrbl | 4 ++- collects/scribblings/reference/reader.scrbl | 4 ++- collects/syntax-color/racket-lexer.rkt | 36 +++++++++++++++---- collects/tests/syntax-color/scheme-lexer.rkt | 28 +++++++++++++-- 4 files changed, 62 insertions(+), 10 deletions(-) diff --git a/collects/scribblings/reference/extflonums.scrbl b/collects/scribblings/reference/extflonums.scrbl index 89c8188b14..a1015863ea 100644 --- a/collects/scribblings/reference/extflonums.scrbl +++ b/collects/scribblings/reference/extflonums.scrbl @@ -22,7 +22,9 @@ A extflonum is @bold{not} a @tech{number} in the sense of A literal extflonum is written like an @tech{inexact number}, but using an explicit @litchar{t} or @litchar{T} exponent marker (see @secref["parse-extflonum"]). For example, @racket[3.5t0] is an -extflonum. +extflonum. The extflonum infinities and non-a-number values are +@as-index{@racket[+inf.t]}, @as-index{@racket[-inf.t]}, +and @as-index{@racket[+nan.t]}. If @racket[(extflonum-available?)] produces @racket[#f], then all operations exported by @racketmodname[racket/extflonum] raise diff --git a/collects/scribblings/reference/reader.scrbl b/collects/scribblings/reference/reader.scrbl index c529639e07..529e2e41fc 100644 --- a/collects/scribblings/reference/reader.scrbl +++ b/collects/scribblings/reference/reader.scrbl @@ -331,7 +331,9 @@ that the digit's actual value is unknown. An @tech{extflonum} has the same syntax as an @nunterm{inexact-real} that includes an @nunterm{exp-mark}, but with @litchar{t} or -@litchar{T} in place of the @nunterm{exp-mark}. A @litchar{#b} +@litchar{T} in place of the @nunterm{exp-mark}. In addition, +@litchar{+inf.t}, @litchar{-inf.t}, @litchar{+nan.t}, @litchar{-nan.t} +are @tech{extflonums}. A @litchar{#b} (binary), @litchar{#o} (octal), @litchar{#d} (decimal), or @litchar{#x} (hexadecimal) radix specification can prefix an extflonum, but @litchar{#i} or @litchar{#e} cannot, and a diff --git a/collects/syntax-color/racket-lexer.rkt b/collects/syntax-color/racket-lexer.rkt index b73d3ab1d4..6e1ba462ae 100644 --- a/collects/syntax-color/racket-lexer.rkt +++ b/collects/syntax-color/racket-lexer.rkt @@ -105,7 +105,9 @@ (:? "\\" "\""))] - [special-numbers (:or (:: n a n ".0") (:: i n f ".0"))] + [special-numbers (:or (:: n a n ".0") (:: i n f ".0") + (:: n a n ".f") (:: i n f ".f"))] + [special-extflonums (:or (:: n a n ".t") (:: i n f ".t"))] [exponent-marker (:or e s f d l)] [exponent-marker16 (:or s l)] [sign (char-set "+-")] @@ -188,14 +190,24 @@ (define-lex-trans make-ureal (syntax-rules () ((_ digit exponent-marker) + (make-ureal* digit exponent-marker make-suffix)))) + + (define-lex-trans make-ureal* + (syntax-rules () + ((_ digit exponent-marker make-suffix) (:or (make-uinteger digit) - (:: (make-uinteger digit) "/" (make-uinteger digit) (:? (make-suffix digit exponent-marker))) - (make-decimal digit exponent-marker))))) + (:: (make-uinteger digit) "/" (make-uinteger digit) (make-suffix digit exponent-marker)) + (make-decimal digit exponent-marker make-suffix))))) (define-lex-trans make-real (syntax-rules () ((_ digit exponent-marker) - (:or (:: (:? sign) (make-ureal digit exponent-marker)) + (make-real* digit exponent-marker make-suffix special-numbers)))) + + (define-lex-trans make-real* + (syntax-rules () + ((_ digit exponent-marker make-suffix special-numbers) + (:or (:: (:? sign) (make-ureal* digit exponent-marker make-suffix)) (:: (char-set "+-") special-numbers))))) (define-lex-trans make-uinteger @@ -204,7 +216,7 @@ (define-lex-trans make-decimal (syntax-rules () - ((_ digit exponent-marker) + ((_ digit exponent-marker make-suffix) (:or (:: (make-uinteger digit) (make-suffix digit exponent-marker)) (:: "." (:+ digit) (:* "#") (make-suffix digit exponent-marker)) (:: (:+ digit) "." (:* digit) (:* "#") (make-suffix digit exponent-marker)) @@ -214,6 +226,14 @@ (syntax-rules () ((_ digit exponent-marker) (:or "" (:: exponent-marker (:? sign) (:+ digit)))))) + (define-lex-trans make-extflonum-suffix + (syntax-rules () + ((_ digit exponent-marker) (:: exponent-marker (:? sign) (:+ digit))))) + + (define-lex-trans make-extflonum + (syntax-rules () + ((_ digit radix) + (:: radix (make-real* digit (:or "t" "T") make-extflonum-suffix special-extflonums))))) (define (ret lexeme type paren start-pos end-pos status) (values lexeme type paren (position-offset start-pos) (position-offset end-pos) status)) @@ -321,7 +341,11 @@ (make-num digit2 radix2 exponent-marker) (make-num digit8 radix8 exponent-marker) (make-num digit10 (:? radix10) exponent-marker) - (make-num digit16 radix16 exponent-marker16)) + (make-num digit16 radix16 exponent-marker16) + (make-extflonum digit2 radix2) + (make-extflonum digit8 radix8) + (make-extflonum digit10 (:? radix10)) + (make-extflonum digit16 radix16)) (ret lexeme 'constant #f start-pos end-pos 'datum)] [keyword (ret lexeme 'hash-colon-keyword #f start-pos end-pos 'datum)] [str (ret lexeme 'string #f start-pos end-pos 'datum)] diff --git a/collects/tests/syntax-color/scheme-lexer.rkt b/collects/tests/syntax-color/scheme-lexer.rkt index 12fa044055..098d01b976 100644 --- a/collects/tests/syntax-color/scheme-lexer.rkt +++ b/collects/tests/syntax-color/scheme-lexer.rkt @@ -461,8 +461,13 @@ end-string (test "#|#| |# a\na" "xxxxxxxxxxx") (test "#|\n#| |# a\na" "xxxxxxxxxxxx") -;; Numbers (mzscheme extensions) - +;; Numbers and extflonums +(test "1e0" "ccc") +(test "1f0" "ccc") +(test "1t0" "ccc") +(test "1.1e0" "ccccc") +(test "1.1f0" "ccccc") +(test "1.1t0" "ccccc") (test "#b1.1" "ccccc") (test "#o1.1" "ccccc") (test "#d1.1" "ccccc") @@ -475,15 +480,34 @@ end-string (test "#d1d+2" "cccccc") (test "1/2e2" "ccccc") (test "+iNf.0" "cccccc") +(test "+iNf.f" "cccccc") +(test "+iNf.t" "cccccc") (test "-InF.0" "cccccc") +(test "-InF.f" "cccccc") +(test "-InF.t" "cccccc") (test "+naN.0" "cccccc") (test "-nAN.0" "cccccc") +(test "-nAN.f" "cccccc") +(test "-nAN.t" "cccccc") (test "-inf.0+1i" "ccccccccc") (test "1-inf.0I" "cccccccc") +(test "1#/2" "cccc") +(test "#e#x+e#s+e@-e#l-e" "ccccccccccccccccc") +(test "1/0" "ccc") +(test "#e1" "ccc") +(test "#i1" "ccc") +(test "#e1.0+2.3l5i" "cccccccccccc") ;; Bad numbers (test "#x1E+2" "xxxxxx") (test "#x1d+2" "xxxxxx") +(test "#e1.0+2.3l5" "xxxxxxxxxxx") + +;; Bad extflonums +(test "#e1t0" "xxxxx") +(test "#i1t0" "xxxxx") +(test "1t0+2t0i" "iiiiiiii") +(test "1t0@2t0" "iiiiiii") ;; Keywords (test "#:" "hh")