2 '<expr>' [ DEFUN | DEFVAR | TERM ] * '</expr>'
4 TERM = [ INT | STRING | SYMBOL | LIST | VAR | FUNCALL ]
7 '<defun fname="' FNAME ? ">'
13 '<args>' FIXED ? OPTIONAL ? REST ? '</args>'
14 | '<args-unevalled>' FIXED ? OPTIONAL ? REST ? '</args-unevalled>'
17 '<fixed> VAR + '</fixed>'
20 '<optional>' VAR + '<optional>'
23 '<rest>' VAR '</rest>'
25 DEFVAR = DEFVAR-INT DEFVAR-STR
28 '<defvar vname="' VNAME '">'
31 <possible-value> [ INT | '<range>' INT INT '</range>' ] *</possible-value>
35 '<defvar vname"' VNAME '">'
38 <possible-value> STR * </possible-value>
42 '<description>' [ TEXT | GETTEXT ] '</description>'
45 '<gettext>' TEXT '</gettext>'
48 '<integer>' INTEGER '</integer>'
50 '<string>' STRING '</string>'
52 '<symbol>' NAME '</symbol>'
54 '<list>' TERM * '</list>' | <list/>
57 '<varref vname="' VNAME '"/>'
60 '<funcall fname="' FNAME '">' TERM * '</funcall>'
61 | '<' PREDEFINED '>' TERM * '</' PREDEFINED '>'
62 | '<' PREDEFINED 'vname="' VNAME '">' TERM * '</' PREDEFINED '>'
66 | 'and' | 'or' | 'not'
67 | 'lt' | 'le' | 'eq' | 'ge' | 'gt' | 'noteq'
68 | 'add' | 'sub' | 'mul' | 'div' | 'mod'
69 | 'logand' | 'logior' | 'logxor' | 'lsh'
70 | 'append' | 'concat' | 'nth' | 'copy' | 'ins' | 'del'
71 | 'progn' | 'if' | 'when' | 'cond'
72 | 'loop' | 'break' | 'while' | 'foreach'
73 | 'quote' | 'eval' | 'type'
75 ;; TERM has a value, and is evaluated to a TERM as below.
76 ;; INT has an integer value, and is evaluated to itself .
77 ;; STRING has a string value, and is evaluated to itself.
78 ;; SYMBOL has a symbol value, and is evaluated to itself.
79 ;; LIST has a list value and, is evaluated to itself.
80 ;; VAR has a value of TERM that is assigned to the variable,
81 ;; and is evalued to that TERM.
82 ;; FUNCALL has a value of TERM that is returned by that function,
83 ;; and is evalued to that TERM.
85 INTTERM = INT | VAR (value is INT) | FUNCALL (return INT)
86 STRTERM = STR | VAR (value is STR) | FUNCALL (return STR)
87 LISTTERM = LIST | VAR (value is LIST) | FUNCALL (return LIST)
90 ;; Here after, when an argument is TERM, it is given to a function
91 ;; without being evaluted. Otherwise, an evaluated term is given.
93 '<set vname="' VNAME '">' ANYTERM '</set>'
94 '<add>' INTTERM + '</add>'
95 '<add vname="' VNAME '">' INTTERM + '</add>'
96 '<sub>' INTTERM + '</sub>'
97 '<sub vname="' VNAME '">' INTTERM + '</sub>'
98 '<mul>' INTTERM + '</mul>'
99 '<mul vname="' VNAME '">' INTTERM + '</mul>'
100 '<div>' INTTERM + '</div>'
101 '<div vname="' VNAME '">' INTTERM + '</div>'
102 '<mod>' INTTERM INTTERM '</mod>'
103 '<mod vname="' VNAME '">' INTTERM '</div>'
104 '<logand> INTTERM + '</logand>'
105 '<logand vname="' VNAME '">' INTTERM + '</logand>'
106 '<logior> INTTERM + '</logior>'
107 '<logior> vname="' VNAME '">' INTTERM + '</logior>'
108 '<logxor> INTTERM + '</logxor>'
109 '<logxor> vname="' VNAME '">' INTTERM + '</logxor>'
110 '<lsh>' INTTERM INTTERM '</lsh>'
111 '<lsh vname="' VNAME '">' INTTERM '</mul>'
112 '<lt>' INTTERM INTTERM '</lt>'
113 '<le>' INTTERM INTTERM '</le>'
114 '<eq>' INTTERM INTTERM '</eq>'
115 '<noteq>' INTTERM INTTERM '</noteq>'
116 '<ge>' INTTERM INTTERM '</ge>'
117 '<gt>' INTTERM INTTERM '</gt>'
118 '<append>' ANYTERM + '</append>'
119 '<concat>' [ INTTERM | STRTERM | LISTTERM ] + '</concat>'
120 '<nth>' INTTERM [ STRTERM | LISTTERM ] '</nth>'
121 '<copy>' LISTTERM '</nth>'
122 '<ins vname="' VNAME '">' INTTERM [ STRTERM | LISTTERM ] '</ins>'
123 '<del vname="' VNAME '">' INTTERM INTTERM '</ins>'
124 '<and>' TERM + '</and>'
125 '<or>' TERM + '</or>'
126 '<not>' TERM '</not>'
127 '<progn>' TERM * '</progn>'
128 '<if>' TERM TERM TERM ? '</if>'
129 '<when>' TERM TERM * '</when>'
130 '<cond>' LIST + '</cond>'
131 '<loop>' TERM + '</loop>'
132 '<while>' TERM + '</while>'
133 '<foreach vname="' VNAME '">' TERM + '</foreach>'
134 '<quote>' TERM '</quote>'
135 '<eval>' TERM '</eval>'
136 '<type>' ANYTERM '</type>'