<expression> ---> <variable> | <literal> | <procedure call>
| <lambda expression> | <conditional> | <assignment>
| <derived expression> | <macro use> | <macro block>
<literal> ---> <quotation> | <self-evaluating>
<self-evaluating> ---> <boolean> | <number> | <character> | <string>
<quotation> ---> '<datum> | (quote <datum>)
<procedure call> ---> (<operator> <operand>*)
<operator> ---> <expression>
<operand> ---> <expression>
<lambda expression> ---> (lambda <formals> <body>)
<formals> ---> (<variable>*) | <variable> | (<variable>+ . <variable>)
<body> ---> <definition>* <sequence>
<sequence> ---> <command>* <expression>
<command> ---> <expression>
<conditional> ---> (if <test> <consequent> <alternate>)
<test> ---> <expression>
<consequent> ---> <expression>
<alternate> ---> <expression> | <empty>
<assignment> ---> (set! <variable> <expression>)
<derived expression> --->
(cond <cond clause>+)
| (cond <cond clause>* (else <sequence>))
| (case <expression>
<case clause>+)
| (case <expression>
<case clause>*
(else <sequence>))
| (and <test>*)
| (or <test>*)
| (let (<binding spec>*) <body>)
| (let <variable> (<binding spec>*) <body>)
| (let* (<binding spec>*) <body>)
| (letrec (<binding spec>*) <body>)
| (begin <sequence>)
| (do (<iteration spec>*)
(<test> <do result>)
<command>*)
| (delay <expression>)
| <quasiquotation>
<cond clause> ---> (<test> <sequence>)
| (<test>)
| (<test> => <recipient>)
<recipient> ---> <expression>
<case clause> ---> ((<datum>*) <sequence>)
<binding spec> ---> (<variable> <expression>)
<iteration spec> ---> (<variable> <init> <step>) | (<variable> <init>)
<init> ---> <expression>
<step> ---> <expression>
<do result> ---> <sequence> | <empty>
<macro use> ---> (<keyword> <datum>*)
<keyword> ---> <identifier>
<macro block> ---> (let-syntax (<syntax spec>*) <body>)
| (letrec-syntax (<syntax spec>*) <body>)
<syntax spec> ---> (<keyword> <transformer spec>)