This section describes how individual tokens (identifiers, numbers, etc.) are formed from sequences of characters. The following sections describe how expressions and programs are formed from sequences of tokens.
<Intertoken space> may occur on either side of any token, but not within a token.
Tokens which require implicit termination (identifiers, numbers, characters, and dot) may be terminated by any <delimiter>, but not necessarily by anything else.
The following five characters are reserved for future extensions to the language: [ ] { } |
<token> –> <identifier> | <boolean> | <number>
| <character> | <string>
| ( | ) | #( | ' | ` | , | ,@ | .
<delimiter> –> <whitespace> | ( | ) | " | ;
<whitespace> –> <space or newline>
<comment> –> ; <all subsequent characters up to a
line break>
<atmosphere> –> <whitespace> | <comment>
<intertoken space> –> <atmosphere>*
<identifier> –> <initial> <subsequent>*
| <peculiar identifier>
<initial> –> <letter> | <special initial>
<letter> –> a | b | c | ... | z
<special initial> –> ! | $ | % | & | * | / | : | < | =
| > | ? | ^ | _ | ~
<subsequent> –> <initial> | <digit>
| <special subsequent>
<digit> –> 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
<special subsequent> –> + | - | . | @
<peculiar identifier> –> + | - | ...
<syntactic keyword> –> <expression keyword>
| else | => | define
| unquote | unquote-splicing
<expression keyword> –> quote | lambda | if
| set! | begin | cond | and | or | case
| let | let* | letrec | do | delay
| quasiquote
<variable> => <any <identifier> that isn't
also a <syntactic keyword>>
<boolean> –> #t | #f
<character> –> #\ <any character>
| #\ <character name>
<character name> –> space | newline
<string> –> " <string element>* "
<string element> –> <any character other than " or \>
| \" | \\
<number> –> <num 2>| <num 8>
| <num 10>| <num 16>
The following rules for <num R>, <complex R>, <real R>, <ureal R>, <uinteger R>, and <prefix R> should be replicated for R = 2, 8, 10, and 16. There are no rules for <decimal 2>, <decimal 8>, and <decimal 16>, which means that numbers containing decimal points or exponents must be in decimal radix.
<num R> –> <prefix R> <complex R>
<complex R> –> <real R> | <real R> @ <real R>
| <real R> + <ureal R> i | <real R> - <ureal R> i
| <real R> + i | <real R> - i
| + <ureal R> i | - <ureal R> i | + i | - i
<real R> –> <sign> <ureal R>
<ureal R> –> <uinteger R>
| <uinteger R> / <uinteger R>
| <decimal R>
<decimal 10> –> <uinteger 10> <suffix>
| . <digit 10>+ #* <suffix>
| <digit 10>+ . <digit 10>* #* <suffix>
| <digit 10>+ #+ . #* <suffix>
<uinteger R> –> <digit R>+ #*
<prefix R> –> <radix R> <exactness>
| <exactness> <radix R>
<suffix> –> <empty>
| <exponent marker> <sign> <digit 10>+
<exponent marker> –> e | s | f | d | l
<sign> –> <empty> | + | -
<exactness> –> <empty> | #i | #e
<radix 2> –> #b
<radix 8> –> #o
<radix 10> –> <empty> | #d
<radix 16> –> #x
<digit 2> –> 0 | 1
<digit 8> –> 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7
<digit 10> –> <digit>
<digit 16> –> <digit 10> | a | b | c | d | e | f