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