EXPR = '' [ DEFUN | DEFVAR | TERM ] * '' TERM = [ INT | STRING | SYMBOL | LIST | VAR | FUNCALL ] DEFUN = '' ARGS ? TERM * '' ARGS = '' FIXED ? OPTIONAL ? REST ? '' | '' FIXED ? OPTIONAL ? REST ? '' FIXED = ' VAR + '' OPTIONAL = '' VAR + '' REST = '' VAR '' 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 * '' | VAR = '' 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 | 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. ;; VAR has a value of TERM that is assigned to the variable, ;; and is evalued to that TERM. ;; FUNCALL has a value of TERM that is returned by that function, ;; and is evalued to that TERM. 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) ;; Here after, when an argument is TERM, it is given to a function ;; without being evaluted. Otherwise, an evaluated term is given. SET = '' TERM '' 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 '' EVAL = '' TERM '' TYPE = '' TERM ''