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