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 = DEFVAR-INT DEFVAR-STR DEFVAR-SYM
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>
'</defvar>'
+DEFVAR-SYM =
+ '<defvar vname"' VNAME '">'
+ DESCRIPTION ?
+ SYMBOL ?
+ <possible-value> SYMBOL * </possible-value>
+ '</defvar>'
+
DESCRIPTION =
'<description>' [ TEXT | GETTEXT ] '</description>'
GETTEXT =
'<gettext>' TEXT '</gettext>'
-VAR =
- '<variable vname="' NAME '"/>'
INT =
'<integer>' INTEGER '</integer>'
STR =
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'
- | 'add-set' | 'sub-set' | 'mul-set' | 'div-set' | 'mod-set'
- | 'logand' | 'logior' | 'logxor' | 'lsh'
- | 'logand-set' | 'logior-set' | 'logxor-set' | 'lsh-set'
- | '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.
+ '<funcall fname="' FNAME '">' TERM * '</funcall>'
+ | 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
+ | 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)
+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 = '<set vname="' VNAME '">' ANYTERM '</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>' ANYTERM + '</append>'
+CONCAT = '<concat>' [ 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>' ANYTERM ? '</break>'
+RETURN = '<return>' ANYTERM ? '</return>'
+QUOTE = '<quote>' TERM '</quote>'
+EVAL = '<eval>' TERM '</eval>'
+TYPE = '<type>' ANYTERM '</type>'