EXPR = '' [ DEFUN | DEFMACRO | DEFVAR | TERM ] * '' TERM = [ INT | STRING | SYMBOL | LIST | ERROR | VAR | FUNCALL ] DEFUN = '' ARGS ? TERM * '' DEFMACRO = '' ARGS ? TERM * '' ARGS = '' FIXED * OPTIONAL * REST ? '' FIXED = '' OPTIONAL = '' REST = '' DEFVAR = DEFVAR-INT DEFVAR-STR DEFVAR-SYM DEFVAR-INT = '' DESCRIPTION ? [ INT POSSIBLE-INT-VALUE ? ] ? '' POSSIBLE-INT-VALUE = [ INT | '' INT INT '' ] + DEFVAR-STR = '' DESCRIPTION ? [ STR DEFVAR-STR_VALUE ? ] ? '' DEFVAR-STR_VALUE = STR + DEFVAR-SYM = '' DESCRIPTION ? [ SYMBOL POSSIBLE-SYM-VALUE ? ] ? '' POSSIBLE-SYM-VALUE = SYMBOL + DESCRIPTION = '' [ TEXT | GETTEXT ] '' GETTEXT = '' TEXT '' INT = '' INTEGER '' STR = '' STRING '' SYMBOL = '' NAME '' LIST = '' TERM * '' ERROR = [ '' | '"' ] STRING '' VARREF = '' FUNCALL = '' TERM * '' | PREDEFINED PREDEFINED = SET | AND | OR | NOT | LT | LE | EQ | GE | GT | NOTEQ | ADD | SUB | MUL | DIV | MOD | LOGAND | LOGIOR | LOGXOR | LSH | APPEND | CONCAT | LENGTH | NTH | COPY | INS | DEL | PROGN | IF | WHEN | COND | LOOP | WHILE | FOREACH | BREAK | RETURN | CATCH | THROW | QUOTE | EVAL | TYPE ;; TERM has a value, and is evaluated to a TERM as below. ;; INT has an integer value, and is evaluated to itself . ;; STRING has a string value, and is evaluated to itself. ;; SYMBOL has a symbol value, and is evaluated to itself. ;; LIST has a list value and, is evaluated to itself. ;; VARREF has a variable, and is evalued to the value of that variable. ;; FUNCALL has a function and arguments to it, and is evalued to the ;; value of function called with those arguments. INTTERM = INT | VAR (value is INT) | FUNCALL (return INT) STRTERM = STR | VAR (value is STR) | FUNCALL (return STR) SYMTERM = SYMBOL | VAR (value is SYMBOL) | FUNCALL (return SYMBOL) LISTTERM = LIST | VAR (value is LIST) | FUNCALL (return LIST) ANYTERM = TERM ;; Here after, when an argument written as TERM, it is given to a ;; function without being evaluted. Otherwise, an evaluated term is ;; given. "the value is NUM" means "the value is ;; NUM". SET = '' ANYTERM '' ADD = '' INTTERM + '' | '' INTTERM + '' SUB = '' INTTERM + '' | '' INTTERM + '' MUL = '' INTTERM + '' | '' INTTERM + '' DIB = '
' INTTERM + '
' | '
' INTTERM + '
' MOD = '' INTTERM INTTERM '' | '' INTTERM '' LOGAND = ' INTTERM + '' | '' INTTERM + '' LOGIOR = ' INTTERM + '' | '' INTTERM + '' LOGXOR = ' INTTERM + '' | '' INTTERM + '' LSH = '' INTTERM INTTERM '' | '' INTTERM '' LT = '' INTTERM INTTERM '' LE = '' INTTERM INTTERM '' EQ = '' INTTERM INTTERM '' NOTEQ = '' INTTERM INTTERM '' GE = '' INTTERM INTTERM '' GT ='' INTTERM INTTERM '' APPEND = '' TERM + '' | '' TERM + '' CONCAT = '' [ INTTERM | STRTERM | LISTTERM ] + '' | '' [ INTTERM | STRTERM | LISTTERM ] + '' LENGTH = '' [ STRTERM | LISTTERM ] '' NTH = '' INTTERM [ STRTERM | LISTTERM ] '' COPY = '' LISTTERM '' INS = '' INTTERM [ STRTERM | LISTTERM ] '' DEL = '' INTTERM INTTERM '' AND = '' TERM + '' OR = '' TERM + '' NOT = '' TERM '' PROGN = '' TERM * '' IF = '' TERM TERM TERM ? '' WHEN = '' TERM TERM * '' COND = '' LIST + '' LOOP = '' TERM + '' WHILE = '' TERM + '' FOREACH = '' TERM + '' BREAK = '' TERM ? '' RETURN = '' TERM ? '' QUOTE = '' TERM '' CATCH = '' [ SYMBOL | ERROR ] TERM + '' | '' [ SYMBOL | ERROR ] TERM + '' ;; Evaluate TERMs one by one until the specified SYMBOL or ERROR is ;; thrown by . If thrown, the value is 1, otherwise the value ;; is 0. If VNAME is specified it is set to the last evaluated term. ;; It is the value of if thrown. THROW = '' SYMBOL ANYTERM ? '' | '' ERROR '' ;; Throw to the catch for SYMBOL or ERROR. The value is ANYTERM (if ;; any) or SYMBOL in the first form, and ERROR in the second form. EVAL = '' TERM '' TYPE = '' TERM ''