*** empty log message ***
[m17n/m17n-lib-cs.git] / xex.txt
diff --git a/xex.txt b/xex.txt
index fce2ebd..f09c047 100644 (file)
--- a/xex.txt
+++ b/xex.txt
@@ -1,5 +1,5 @@
 EXPR =
-  '<expr>' [ DEFUN | DEFVAR | TERM ] * '</expr>'
+  '<expr>' [ DEFUN | DEFMACRO | DEFVAR | TERM ] * '</expr>'
 
 TERM = [ INT | STRING | SYMBOL | LIST | VAR | FUNCALL ]
 
@@ -9,9 +9,14 @@ DEFUN =
   TERM *
   '</defun>'
 
+DEFMACRO =
+  '<defmacro fname="' FNAME ? ">'
+  ARGS ?
+  TERM *
+  '</defmacro>'
+
 ARGS =
   '<args>' FIXED ? OPTIONAL ? REST ? '</args>'
-  | '<args-unevalled>' FIXED ? OPTIONAL ? REST ? '</args-unevalled>'
 
 FIXED =
   '<fixed> VAR + '</fixed>'
@@ -22,22 +27,35 @@ OPTIONAL =
 REST =
   '<rest>' VAR '</rest>'
 
-DEFVAR = DEFVAR-INT DEFVAR-STR
+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-SYM-VALUE ? ] ?
   '</defvar>'
 
+POSSIBLE-SYM-VALUE =
+  <possible-value> SYMBOL + </possible-value>
+
 DESCRIPTION =
   '<description>' [ TEXT | GETTEXT ] '</description>'
 
@@ -58,19 +76,18 @@ VAR =
 
 FUNCALL =
   '<funcall fname="' FNAME '">' TERM * '</funcall>'
-  | '<' PREDEFINED '>' TERM * '</' PREDEFINED '>'
-  | '<' PREDEFINED 'vname="' VNAME '">' TERM * '</' PREDEFINED '>'
+  | PREDEFINED
 
 PREDEFINED =
-  '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'
-  | 'loop' | 'break' | 'while' | 'foreach'
-  | 'quote' | 'eval' | 'type'
+  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 .
@@ -84,53 +101,58 @@ PREDEFINED =
 
 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.
 
-'<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>'
+SET = '<set vname="' VNAME '">' TERM '</set>'
+ADD = '<add>' INTTERM + '</add>'
+      | '<add vname="' VNAME '">' INTTERM + '</add>'
+SUB = '<sub>' INTTERM + '</sub>'
+      | '<sub vname="' VNAME '">' INTTERM + '</sub>'
+MUL = '<mul>' INTTERM + '</mul>'
+      | '<mul vname="' VNAME '">' INTTERM + '</mul>'
+DIB = '<div>' INTTERM + '</div>'
+      | '<div vname="' VNAME '">' INTTERM + '</div>'
+MOD = '<mod>' INTTERM INTTERM '</mod>'
+      | '<mod vname="' VNAME '">' INTTERM '</div>'
+LOGAND = '<logand> INTTERM + '</logand>'
+         | '<logand vname="' VNAME '">' INTTERM + '</logand>'
+LOGIOR = '<logior> INTTERM + '</logior>'
+         | '<logior vname="' VNAME '">' INTTERM + '</logior>'
+LOGXOR = '<logxor> INTTERM + '</logxor>'
+         | '<logxor vname="' VNAME '">' INTTERM + '</logxor>'
+LSH = '<lsh>' INTTERM INTTERM '</lsh>'
+      | '<lsh vname="' VNAME '">' INTTERM '</mul>'
+LT = '<lt>' INTTERM INTTERM '</lt>'
+LE = '<le>' INTTERM INTTERM '</le>'
+EQ = '<eq>' INTTERM INTTERM '</eq>'
+NOTEQ = '<noteq>' INTTERM INTTERM '</noteq>'
+GE = '<ge>' INTTERM INTTERM '</ge>'
+GT ='<gt>' INTTERM INTTERM '</gt>'
+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>'
+INS = '<ins vname="' VNAME '">' INTTERM [ STRTERM | LISTTERM ] '</ins>'
+DEL = '<del vname="' VNAME '">' INTTERM INTTERM '</ins>'
+AND = '<and>' TERM + '</and>'
+OR = '<or>' TERM + '</or>'
+NOT = '<not>' TERM '</not>'
+PROGN = '<progn>' TERM * '</progn>'
+IF = '<if>' TERM TERM TERM ? '</if>'
+WHEN = '<when>' TERM TERM * '</when>'
+COND = '<cond>' LIST + '</cond>'
+LOOP = '<loop>' TERM + '</loop>'
+WHILE = '<while>' TERM + '</while>'
+FOREACH = '<foreach vname="' VNAME '">' TERM + '</foreach>'
+BREAK = '<break>' TERM ? '</break>'
+RETURN = '<return>' TERM ? '</return>'
+QUOTE = '<quote>' TERM '</quote>'
+EVAL = '<eval>' TERM '</eval>'
+TYPE = '<type>' TERM '</type>'