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 ''