EXPR = '' [ DEFUN | DEFMACRO | DEFVAR | TERM ] * '' TERM = [ VAR | DIRECT | FUNCALL ] TYPE = 'integer' | 'string' | 'boolean' | 'symbol' | 'list' DEFUN = '' ARGS ? TERM * '' ARGS = '' [ SYMBOL | VAR ] * OPTIONAL ? REST ? '' OPTIONAL = '' [ SYMBOL | VAR ] * REST = '' [ SYMBOL | VAR ] DEFVAR = DEFVAR-INT DEFVAR-STR DEFVAR-BOOL DEFVAR-INT = '' DESCRIPTION ? INT ? [ INT | '' INT INT '' ] * '' DEFVAR-STR = '' DESCRIPTION ? STR ? STR * '' DEFVAR-BOOL = '' DESCRIPTION ? BOOL ? '' DESCRIPTION = '' TEXT '' VAR = '' DIRECT = INT STR BOOL SYMBOL LIST INT = '' INTEGER '' STR = '' STRING '' BOOL = '' [ 'true' | 'false' ] SYMBOL = '' NAME '' LIST = '' DIRECT * '' | FUNCALL = '' TERM * '' | '<' PREDEFINED-FUNC-SYMBOL '>' TERM * '' | '<' PREDEFINED-MACRO-SYMBOL '>' TERM * '' PREDEFINED-FUNC-SYMBOL = 'set' | 'and' | 'or' | 'not' | 'lt' | 'le' | 'eq' | 'ge' | 'gt' | 'noteq' | 'add' | 'sub' | 'mul' | 'div' | 'mod' | 'add-set' | 'sub-set' | 'mul-set' | 'div-set' | 'mod-set' | 'logand' | 'logior' | 'logxor' | 'lsh' | 'logand-set' | 'logior-set' | 'logxor-set' | 'lsh-set' | 'append' | 'concat' | 'substr' | 'cons' | 'car' | 'cdr' | 'nth' PREDEFINED-FUNC-NAME = PREDEFINED-FUNC-SYMBOL | '=' | '&&' | '||' | '!' | '<' | '<=' | '==' | '>=' | '>' | '!=' | '+' | '-' | '*' | '/' | '%' | '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '~=' | '<<=' | '>>=' PREDEFINED-MACRO-SYMBOL = 'case' | 'cond' | 'if' | 'progn' | 'when' | 'while' PREDEFINED-MACRO-NAME = PREDEFINED-MACRO-SYMBOL