*** empty log message ***
[m17n/m17n-lib-cs.git] / xex.txt
diff --git a/xex.txt b/xex.txt
index 4a36efe..fce2ebd 100644 (file)
--- a/xex.txt
+++ b/xex.txt
@@ -1,38 +1,38 @@
 EXPR =
-  '<expr>' [ DEFUN | DEFMACRO | DEFVAR | TERM ] * '</expr>'
+  '<expr>' [ DEFUN | DEFVAR | TERM ] * '</expr>'
 
-TERM = [ VAR | INT | STRING | SYMBOL | LIST | FUNCALL ]
+TERM = [ INT | STRING | SYMBOL | LIST | VAR | FUNCALL ]
 
 DEFUN =
-  '<defun fname="' FUNCNAME ? ">'
+  '<defun fname="' FNAME ? ">'
   ARGS ?
-  BODY ?
+  TERM *
   '</defun>'
 
 ARGS =
-  '<args>' VAR * OPTIONAL ? REST ? '</args>'
-  | '<args-unevalled>' VAR * OPTIONAL ? REST ? '</args-unevalled>'
+  '<args>' FIXED ? OPTIONAL ? REST ? '</args>'
+  | '<args-unevalled>' FIXED ? OPTIONAL ? REST ? '</args-unevalled>'
+
+FIXED =
+  '<fixed> VAR + '</fixed>'
 
 OPTIONAL =
-  '<optional/>' VAR *
+  '<optional>' VAR + '<optional>'
 
 REST =
-  '<rest/>' VAR
-
-BODY =
-  '<body>' TERM * '</body>'
+  '<rest>' VAR '</rest>'
 
 DEFVAR = DEFVAR-INT DEFVAR-STR
 
 DEFVAR-INT =
-  '<defvar vname="' VARNAME '">'
+  '<defvar vname="' VNAME '">'
   DESCRIPTION ?
   INT ?
-  <possible-value>[ INT | '<range>' INT INT '</range>' ] *</possible-value>
+  <possible-value> [ INT | '<range>' INT INT '</range>' ] *</possible-value>
   '</defvar>'
 
 DEFVAR-STR =
-  '<defvar vname"' VARNAME '">'
+  '<defvar vname"' VNAME '">'
   DESCRIPTION ?
   STR ?
   <possible-value> STR * </possible-value>
@@ -44,8 +44,6 @@ DESCRIPTION =
 GETTEXT =
   '<gettext>' TEXT '</gettext>'
 
-VAR =
-  '<variable vname="' NAME '"/>'
 INT =
   '<integer>' INTEGER '</integer>'
 STR =
@@ -55,65 +53,84 @@ SYMBOL =
 LIST =
   '<list>' TERM * '</list>' | <list/>
 
+VAR =
+  '<varref vname="' VNAME '"/>'
+
 FUNCALL =
-  '<funcall fname="' PREDEFINED-FUNC-NAME '">' TERM * '</funcall>'
-  | '<' PREDEFINED-FUNC-SYMBOL '>' TERM * '</' PREDEFINED-FUNC-SYMBOL '>'
-
-PREDEFINED-FUNC-SYMBOL =
-  SET
-  | AND | OR | NOT
-  | LT | LE | EQ | GE | GT
-  | NOTEQ
-  | ADD | SUB | MUL | DIV | MOD
-  | LOGAND | LOGIOR | LOGXOR | LSH
-  | APPEND | CONCAT | NTH  | COPY | INS | DEL
-  | PROGN | IF | WHEN | COND
-  | WHILE | FOR | FOREACH
-  | EVAL | TYPE
-
-PREDEFINED-FUNC-NAME =
-  PREDEFINED-FUNC-SYMBOL
-  | '='
-  | '&&' | '||' | '!'
-  | '<' | '<=' | '==' | '>=' | '>'
-  | '!='
-  | '+' | '-' | '*' | '/' | '%'
-  | '+=' | '-=' | '*=' | '/=' | '%='
-  | '&=' | '|=' | '~=' | '<<=' | '>>='
-
-TRUE =
-  '<integer>0</integer>' 
-FALSE =
-  '<integer>1</integer>' 
-
-;; TERM is evaluated to a TERM.
-;; INT is evaluated to itself.
-;; STRING is evaluated to itself.
-;; SYMBOL is evaluated to itself.
-;; LIST is evaluated to itself.
-;; VAR is evaluated to TERM that is set to that variable.
-;; FUNCALL is evaluated to TERM returned by that function.
-
-SET =
-  '<set vname="' VARNAME '">' TERM '</set>'
-;; Set the variable of name VARNAME to TERM.
-
-AND =  ;; arguments unevalled
-  '<and> TERM ... </and>
-OR (unevalled-arg ...) =
-  '<or> TERM ... </or>
-NOT (arg) =
-  '<not> TERM </not>
-
-LT (arg ...) =
-  '<lt>' TERM ... '</lt>'
+  '<funcall fname="' FNAME '">' TERM * '</funcall>'
+  | '<' PREDEFINED '>' TERM * '</' PREDEFINED '>'
+  | '<' PREDEFINED 'vname="' VNAME '">' TERM * '</' PREDEFINED '>'
 
+PREDEFINED =
+  'set'
   | 'and' | 'or' | 'not'
-  | 'lt' | 'le' | 'eq' | 'ge' | 'gt'
-  | 'noteq'
+  | 'lt' | 'le' | 'eq' | 'ge' | 'gt' | 'noteq'
   | 'add' | 'sub' | 'mul' | 'div' | 'mod'
   | 'logand' | 'logior' | 'logxor' | 'lsh'
   | 'append' | 'concat' | 'nth'  | 'copy' | 'ins' | 'del'
   | 'progn' | 'if' | 'when' | 'cond'
-  | 'while' | 'for' | 'foreach'
-  | 'eval' | 'type'
+  | 'loop' | 'break' | 'while' | 'foreach'
+  | '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)
+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.
+
+'<set vname="' VNAME '">' ANYTERM '</set>'
+'<add>' INTTERM + '</add>'
+'<add vname="' VNAME '">' INTTERM + '</add>'
+'<sub>' INTTERM + '</sub>'
+'<sub vname="' VNAME '">' INTTERM + '</sub>'
+'<mul>' INTTERM + '</mul>'
+'<mul vname="' VNAME '">' INTTERM + '</mul>'
+'<div>' INTTERM + '</div>'
+'<div vname="' VNAME '">' INTTERM + '</div>'
+'<mod>' INTTERM INTTERM '</mod>'
+'<mod vname="' VNAME '">' INTTERM '</div>'
+'<logand> INTTERM + '</logand>'
+'<logand vname="' VNAME '">' INTTERM + '</logand>'
+'<logior> INTTERM + '</logior>'
+'<logior> vname="' VNAME '">' INTTERM + '</logior>'
+'<logxor> INTTERM + '</logxor>'
+'<logxor> vname="' VNAME '">' INTTERM + '</logxor>'
+'<lsh>' INTTERM INTTERM '</lsh>'
+'<lsh vname="' VNAME '">' INTTERM '</mul>'
+'<lt>' INTTERM INTTERM '</lt>'
+'<le>' INTTERM INTTERM '</le>'
+'<eq>' INTTERM INTTERM '</eq>'
+'<noteq>' INTTERM INTTERM '</noteq>'
+'<ge>' INTTERM INTTERM '</ge>'
+'<gt>' INTTERM INTTERM '</gt>'
+'<append>' ANYTERM + '</append>'
+'<concat>' [ INTTERM | STRTERM | LISTTERM ] + '</concat>'
+'<nth>' INTTERM [ STRTERM | LISTTERM ] '</nth>'
+'<copy>' LISTTERM '</nth>'
+'<ins vname="' VNAME '">' INTTERM [ STRTERM | LISTTERM ] '</ins>'
+'<del vname="' VNAME '">' INTTERM INTTERM '</ins>'
+'<and>' TERM + '</and>'
+'<or>' TERM + '</or>'
+'<not>' TERM '</not>'
+'<progn>' TERM * '</progn>'
+'<if>' TERM TERM TERM ? '</if>'
+'<when>' TERM TERM * '</when>'
+'<cond>' LIST + '</cond>'
+'<loop>' TERM + '</loop>'
+'<while>' TERM + '</while>'
+'<foreach vname="' VNAME '">' TERM + '</foreach>'
+'<quote>' TERM '</quote>'
+'<eval>' TERM '</eval>'
+'<type>' ANYTERM '</type>'