;; BNF
;; m-expr ::= m-eq | m-term .
;; m-eq ::= m-term m-equal m-term .
;; m-term ::= m-var | m-call | m-cond | s-expr | m-lambda-list .
;; m-lambda-list ::= m-lambda '[' '[' m-pars ']' ';' m-expr ']' .
;; m-pars ::= | m-pars-items .
;; m-pars-items ::= m-symbol | m-symbol ';' m-pars-items .
;; m-var ::= m-symbol .
;; m-function ::= m-symbol | m-lambda-list .
;; m-call ::= m-function '[' m-args ']' .
;; m-args ::= | m-arg-item .
;; m-arg-items ::= m-expr | m-expr ';' m-args .
;; m-cond ::= '[' m-clauses ']' .
;; m-clauses ::= | m-clause-items .
;; m-clause-items ::= m-clause | m-clause ';' m-clauses .
;; m-clause ::= m-expr m-arrow m-expr .
;; s-expr ::= s-atom | '(' s-list ')' .
;; s-list ::= | s-list-items .
;; s-list-items ::= s-expr | s-expr ',' s-list-items .
;; s-atom ::= s-symbol | s-integer | s-float | s-string .
;; m-lambda ::= 'fn' .
;; m-nil ::= 'nil' .
;; m-true ::= 't' .
;; m-false ::= 'f' .
;; m-equal ::= '=' .
;; m-arrow ::= '->' .
;; m-symbol ::= "[a-z][a-z0-9]*" .
;; s-symbol ::= "[A-Z][A-Z0-9]*" .
;; s-integer ::= "[-+]?[0-9]+" .
;; s-float ::= "[-+]?[0-9]+.[0-9]+(E[-+]?[0-9]+)?" .