EXPR =
'<expr>' [ DEFUN | DEFMACRO | DEFVAR | TERM ] * '</expr>'
-TERM = [ INT | STRING | SYMBOL | LIST | VAR | FUNCALL ]
+TERM = [ INT | STRING | SYMBOL | LIST | ERROR | VAR | FUNCALL ]
DEFUN =
'<defun fname="' FNAME ? ">'
'</defmacro>'
ARGS =
- '<args>' FIXED ? OPTIONAL ? REST ? '</args>'
+ '<args>' FIXED * OPTIONAL * REST ? '</args>'
FIXED =
- '<fixed> VAR + '</fixed>'
+ '<fixed vname="' VNAME '">'
OPTIONAL =
- '<optional>' VAR + '<optional>'
+ '<optional vname="' VNAME '">'
REST =
- '<rest>' VAR '</rest>'
+ '<rest vname="' VNAME '">'
DEFVAR = DEFVAR-INT DEFVAR-STR DEFVAR-SYM
SYMBOL =
'<symbol>' NAME '</symbol>'
LIST =
- '<list>' TERM * '</list>' | <list/>
+ '<list>' TERM * '</list>'
+ERROR =
+ [ '<error>' | '<error ename="' ENAME '">"' ] STRING '</error>'
-VAR =
+VARREF =
'<varref vname="' VNAME '"/>'
FUNCALL =
| LOGAND | LOGIOR | LOGXOR | LSH
| APPEND | CONCAT | LENGTH | NTH | COPY | INS | DEL
| PROGN | IF | WHEN | COND
- | LOOP | WHILE | FOREACH | BREAK | RETURN
+ | LOOP | WHILE | FOREACH | BREAK | RETURN | CATCH | THROW
| QUOTE | EVAL | TYPE
;; TERM has a value, and is evaluated to a TERM as below.
;; 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.
+;; 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 is TERM, it is given to a function
-;; without being evaluted. Otherwise, an evaluated term is given.
+;; 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
+;; <integer>NUM</integer>".
-SET = '<set vname="' VNAME '">' TERM '</set>'
+SET = '<set vname="' VNAME '">' ANYTERM '</set>'
ADD = '<add>' INTTERM + '</add>'
| '<add vname="' VNAME '">' INTTERM + '</add>'
SUB = '<sub>' INTTERM + '</sub>'
BREAK = '<break>' TERM ? '</break>'
RETURN = '<return>' TERM ? '</return>'
QUOTE = '<quote>' TERM '</quote>'
+
+CATCH = '<catch>' [ SYMBOL | ERROR ] TERM + '</catch>'
+ | '<catch vname="' VNAME '">' [ SYMBOL | ERROR ] TERM + '</catch>'
+
+;; Evaluate TERMs one by one until the specified SYMBOL or ERROR is
+;; thrown by <throw/>. 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 <throw/> if thrown.
+
+THROW = '<throw>' SYMBOL ANYTERM ? '</throw>'
+ | '<throw>' ERROR '</throw>'
+
+;; 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 = '<eval>' TERM '</eval>'
TYPE = '<type>' TERM '</type>'