|
|
|
@ -17,24 +17,24 @@
|
|
|
|
|
(lexer-src-pos
|
|
|
|
|
|
|
|
|
|
;; Skip comments, without accumulating extra position information
|
|
|
|
|
[(: (whitespace) (comment)) (return-without-pos (scheme-lexer input-port))]
|
|
|
|
|
[(: whitespace comment) (return-without-pos (scheme-lexer input-port))]
|
|
|
|
|
|
|
|
|
|
["#t" (token-DATUM #t)]
|
|
|
|
|
["#f" (token-DATUM #f)]
|
|
|
|
|
[(@ "#\\" (any)) (token-DATUM (caddr (string->list lexeme)))]
|
|
|
|
|
[(@ "#\\" any) (token-DATUM (caddr (string->list lexeme)))]
|
|
|
|
|
["#\\space" (token-DATUM #\space)]
|
|
|
|
|
["#\\newline" (token-DATUM #\newline)]
|
|
|
|
|
[(: (@ (initial) (* (subsequent))) + - "...") (token-DATUM (string->symbol lexeme))]
|
|
|
|
|
[(: (@ initial (* subsequent)) "+" "-" "...") (token-DATUM (string->symbol lexeme))]
|
|
|
|
|
[#\" (token-DATUM (list->string (get-string-token input-port)))]
|
|
|
|
|
[#\( 'OP]
|
|
|
|
|
[#\) 'CP]
|
|
|
|
|
[#\[ 'OP]
|
|
|
|
|
[#\] 'CP]
|
|
|
|
|
["#(" 'HASHOP]
|
|
|
|
|
[(num2) (token-DATUM (string->number lexeme 2))]
|
|
|
|
|
[(num8) (token-DATUM (string->number lexeme 8))]
|
|
|
|
|
[(num10) (token-DATUM (string->number lexeme 10))]
|
|
|
|
|
[(num16) (token-DATUM (string->number lexeme 16))]
|
|
|
|
|
[num2 (token-DATUM (string->number lexeme 2))]
|
|
|
|
|
[num8 (token-DATUM (string->number lexeme 8))]
|
|
|
|
|
[num10 (token-DATUM (string->number lexeme 10))]
|
|
|
|
|
[num16 (token-DATUM (string->number lexeme 16))]
|
|
|
|
|
["'" 'QUOTE]
|
|
|
|
|
["`" 'QUASIQUOTE]
|
|
|
|
|
["," 'UNQUOTE]
|
|
|
|
@ -53,117 +53,113 @@
|
|
|
|
|
|
|
|
|
|
(define-lex-abbrevs
|
|
|
|
|
[any (- #\000 #\377)]
|
|
|
|
|
[letter (: (- a z) (- #\A #\Z))]
|
|
|
|
|
[letter (: (- "a" "z") (- #\A #\Z))]
|
|
|
|
|
[digit (- #\0 #\9)]
|
|
|
|
|
[whitespace (: #\newline #\return #\tab #\space #\vtab)]
|
|
|
|
|
[initial (: (letter) ! $ % & * / : < = > ? ^ _ ~ @)]
|
|
|
|
|
[subsequent (: (initial) (digit) + - #\. @)]
|
|
|
|
|
[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)))]
|
|
|
|
|
; [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))]
|
|
|
|
|
|
|
|
|
|
[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)))]
|
|
|
|
|
[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)))]
|
|
|
|
|
[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)))]
|
|
|
|
|
[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))]
|
|
|
|
|
[digit16 (: digit (- #\a #\f) (- #\A #\F))]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
[suffix (: (@) (@ (exponent-marker) (sign) (+ (digit10))))]
|
|
|
|
|
[exponent-marker (: e s f d l)]
|
|
|
|
|
[sign (: (@) + -)]
|
|
|
|
|
[suffix (: (@) (@ exponent-marker sign (+ digit10)))]
|
|
|
|
|
[exponent-marker (: "e" "s" "f" "d" "l")]
|
|
|
|
|
[sign (: (@) "+" "-")]
|
|
|
|
|
[exactness (: (@) "#i" "#e")])
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|