syntax-color/racket-lexer: update for single-precision and extflonums

Includes a doc fix to note `+inf.t', etc.
This commit is contained in:
Matthew Flatt 2013-03-28 20:35:23 -06:00
parent 1dcc7ca4dc
commit 5afd1b4118
4 changed files with 62 additions and 10 deletions

View File

@ -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

View File

@ -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

View File

@ -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)]

View File

@ -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")