*** empty log message ***
[m17n/m17n-lib-cs.git] / xex.txt
diff --git a/xex.txt b/xex.txt
index 7069f4b..337f0b6 100644 (file)
--- a/xex.txt
+++ b/xex.txt
@@ -1,7 +1,7 @@
 EXPR =
-  '<expr>' [ DEFUN | DEFVAR | TERM ] * '</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 ? ">'
@@ -9,42 +9,53 @@ DEFUN =
   TERM *
   '</defun>'
 
+DEFMACRO =
+  '<defmacro fname="' FNAME ? ">'
+  ARGS ?
+  TERM *
+  '</defmacro>'
+
 ARGS =
-  '<args>' FIXED ? OPTIONAL ? REST ? '</args>'
-  | '<args-unevalled>' FIXED ? OPTIONAL ? REST ? '</args-unevalled>'
+  '<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
 
 DEFVAR-INT =
   '<defvar vname="' VNAME '">'
   DESCRIPTION ?
-  INT ?
-  <possible-value> [ INT | '<range>' INT INT '</range>' ] *</possible-value>
+  [ INT POSSIBLE-INT-VALUE ? ] ?
   '</defvar>'
 
+POSSIBLE-INT-VALUE =
+  <possible-value> [ INT | '<range>' INT INT '</range>' ] + </possible-value>
+
 DEFVAR-STR =
   '<defvar vname"' VNAME '">'
   DESCRIPTION ?
-  STR ?
-  <possible-value> STR * </possible-value>
+  [ STR DEFVAR-STR_VALUE ? ] ?
   '</defvar>'
 
+DEFVAR-STR_VALUE =
+  <possible-value> STR + </possible-value>
+
 DEFVAR-SYM =
   '<defvar vname"' VNAME '">'
   DESCRIPTION ?
-  SYMBOL ?
-  <possible-value> SYMBOL * </possible-value>
+  [ SYMBOL POSSIBLE-SYM-VALUE ? ] ?
   '</defvar>'
 
+POSSIBLE-SYM-VALUE =
+  <possible-value> SYMBOL + </possible-value>
+
 DESCRIPTION =
   '<description>' [ TEXT | GETTEXT ] '</description>'
 
@@ -58,9 +69,11 @@ STR =
 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 =
@@ -75,7 +88,7 @@ PREDEFINED =
   | 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.
@@ -83,10 +96,9 @@ PREDEFINED =
 ;; 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)
@@ -94,8 +106,10 @@ 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 '">' ANYTERM '</set>'
 ADD = '<add>' INTTERM + '</add>'
@@ -111,9 +125,9 @@ MOD = '<mod>' INTTERM INTTERM '</mod>'
 LOGAND = '<logand> INTTERM + '</logand>'
          | '<logand vname="' VNAME '">' INTTERM + '</logand>'
 LOGIOR = '<logior> INTTERM + '</logior>'
-         | '<logior> vname="' VNAME '">' INTTERM + '</logior>'
+         | '<logior vname="' VNAME '">' INTTERM + '</logior>'
 LOGXOR = '<logxor> INTTERM + '</logxor>'
-         | '<logxor> vname="' VNAME '">' INTTERM + '</logxor>'
+         | '<logxor vname="' VNAME '">' INTTERM + '</logxor>'
 LSH = '<lsh>' INTTERM INTTERM '</lsh>'
       | '<lsh vname="' VNAME '">' INTTERM '</mul>'
 LT = '<lt>' INTTERM INTTERM '</lt>'
@@ -122,8 +136,10 @@ EQ = '<eq>' INTTERM INTTERM '</eq>'
 NOTEQ = '<noteq>' INTTERM INTTERM '</noteq>'
 GE = '<ge>' INTTERM INTTERM '</ge>'
 GT ='<gt>' INTTERM INTTERM '</gt>'
-APPEND = '<append>' ANYTERM + '</append>'
+APPEND = '<append>' TERM + '</append>'
+         | '<append vname=" VNAME '">' TERM + '</append>'
 CONCAT = '<concat>' [ INTTERM | STRTERM | LISTTERM ] + '</concat>'
+         | '<concat vname=" VNAME '">' [ INTTERM | STRTERM | LISTTERM ] + '</concat>'
 LENGTH = '<length>' [ STRTERM | LISTTERM ] '</length>'
 NTH = '<nth>' INTTERM [ STRTERM | LISTTERM ] '</nth>'
 COPY = '<copy>' LISTTERM '</nth>'
@@ -139,8 +155,23 @@ COND = '<cond>' LIST + '</cond>'
 LOOP = '<loop>' TERM + '</loop>'
 WHILE = '<while>' TERM + '</while>'
 FOREACH = '<foreach vname="' VNAME '">' TERM + '</foreach>'
-BREAK = '<break>' ANYTERM ? '</break>'
-RETURN = '<return>' ANYTERM ? '</return>'
+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>' ANYTERM '</type>'
+TYPE = '<type>' TERM '</type>'