BNF范式

<> :用左右尖括号括起来的成分表示语法构造成分,或称语法单位,为非终结符。
:=:= :该符号的左部由右部定义。
[] :表示方括号内的成分为任选项。
() :表示圆括号内的成分优先。
| :或

scheme

<S表达式>:=:=<原子>|(<S表达式><SPACE><S表达式>)
<SPACE>:=:=" "
<原子>:=:=<数字原子>|<符号原子>
<数字原子>:=:=[+|-]<无符号定点数>|[+|-]<无符号浮点数>|<逻辑数>
<无符号定点数>:=:=<数字>|<数字><无符号定点数>
<数字>:=:= 0123456789{0|1|2|3|4|5|6|7|8|9}
<无符号浮点数>:=:=<数字><余浮点数>|.<十进制小数>|e<指数部分>
<余浮点数>:=:=<数字><余浮点数>|.<十进制小数>|e<指数部分>|ϵ\epsilon
<十进制小数>:=:=<数字><余十进制小数>
<余十进制小数>:=:=e<指数部分>|<数字><余十进制小数>|ϵ\epsilon
<指数部分>:=:=<数字><余整指数>|[+|-]<整指数>
<整指数>:=:=<数字><余整指数>
<余整指数>:=:=<数字><余整指数>|ϵ\epsilon

<逻辑数>:=:=#T|()

<符号原子>:=:=(<字母>|<无()的特殊符号>)|(<字母><无()的特殊符号>)<无()的任意符号>
<无()的任意符号>:=:=<数字>|<字母>|<无()的特殊符号>

函数

<S表达式>:=:=<原始函数>|<构造函数>|<谓词函数>|<输出函数>|<控制流程>

<原始函数>:=:=<算术函数>|<求值函数>|<禁止求值函数>|<原始链表构造器>|<原始链表选择器>

<算术函数>:=:=‘('<算术运算符>|SQRT <S表达式>')'
<算术运算符>:=:= +/{+|-|*|/}
<求值函数>:=:='('EVAL<S表达式>')'
<禁止求值函数>:=:='('QUOTE|'<S表达式>')'
<原始链表构造器>:=:='('CONS|LIST<参数列表>')'
<原始链表选择器>:=:='('CAR|CDR<参数>')'
<参数列表>:=:=<参数>|<参数><SPACE><参数列表>
<参数>:=:=QUOTE|'|ϵ\epsilon<S表达式>

<构造函数>:=:=<lambda函数>|<自定义函数>
<lambda函数>:=:='('[<符号名>]'('lambda'('<参数列表>')'<S表达式>')'')'
<符号名>:=:=<符号原子>
<自定义函数>:=:='('define<函数名><S表达式>')'|'('define'('<函数名><参数>')'<函数体>)
<函数体>:=:=<S表达式>

<谓词函数>:=:='('<关系运算符><SPACE><S表达式>')'
<关系运算符>:=:=eq?|null?|list?|eqv?|equal?|=|<|>|<=|>=|even?|odd?|zero?

<输出函数>:=:='('display<S表达式>')'|'('newkine')'

<控制流程>:=:=<双向选择><多向选择>
<双向选择>:=:='('if<谓词函数><then表达式><else表达式>)
<then表达式>:=:=<S表达式>
<else表达式>:=:=<S表达式>
<多向选择>:=:='('cond<选择对>['('else<S表达式>|<S表达式>|')']')'
<选择对>:=:='('<谓词函数><S表达式>')'|'('<谓词函数><S表达式>')'<选择对>

reference

[1]布辉,刘冉.LISP语言的特点及其文法的BNF描述[J].福建电脑,2006(10):83-84.