X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=xex.txt;h=0adac9baba91c77604a1fd8889711c619dc12081;hb=b0944101586bc138ea4bd2df4ce4ee8f6cc8c2c4;hp=5e58f74122e7544fbab25b15f53bae3da3d17494;hpb=c6e7c78626156216ba804f51fe818edbc63d4955;p=m17n%2Fm17n-lib-cs.git
diff --git a/xex.txt b/xex.txt
index 5e58f74..0adac9b 100644
--- a/xex.txt
+++ b/xex.txt
@@ -1,51 +1,67 @@
EXPR =
'' [ DEFUN | DEFMACRO | DEFVAR | TERM ] * ''
-TERM = [ VAR | INT | STRING | SYMBOL | LIST | FUNCALL ]
+TERM = [ INT | STRING | SYMBOL | LIST | ERROR | VARREF | FUNCALL ]
DEFUN =
- ''
+ ''
ARGS ?
- BODY ?
+ TERM *
''
+DEFMACRO =
+ ''
+ ARGS ?
+ TERM *
+ ''
+
ARGS =
- '' VAR * OPTIONAL ? REST ? ''
- | '' VAR * OPTIONAL ? REST ? ''
+ '' FIXED * OPTIONAL * REST ? ''
+
+FIXED =
+ ''
OPTIONAL =
- '' VAR *
+ ''
REST =
- '' VAR
+ ''
-BODY =
- '' TERM * ''
-
-DEFVAR = DEFVAR-INT DEFVAR-STR
+DEFVAR = DEFVAR-INT | DEFVAR-STR | DEFVAR-SYM
DEFVAR-INT =
- ''
+ ''
DESCRIPTION ?
- INT ?
- [ INT | '' INT INT '' ] *
+ [ INT POSSIBLE-INT-VALUE ? ] ?
''
+POSSIBLE-INT-VALUE =
+ [ INT | '' INT INT '' ] +
+
DEFVAR-STR =
- ''
+ ''
+ DESCRIPTION ?
+ [ STR DEFVAR-STR_VALUE ? ] ?
+ ''
+
+DEFVAR-STR_VALUE =
+ STR +
+
+DEFVAR-SYM =
+ ''
DESCRIPTION ?
- STR ?
- STR *
+ [ SYMBOL POSSIBLE-SYM-VALUE ? ] ?
''
+POSSIBLE-SYM-VALUE =
+ SYMBOL +
+
DESCRIPTION =
'' [ TEXT | GETTEXT ] ''
GETTEXT =
'' TEXT ''
-VAR =
- ''
INT =
'' INTEGER ''
STR =
@@ -53,45 +69,192 @@ STR =
SYMBOL =
'' NAME ''
LIST =
- '' TERM * '
' |
+ '' TERM * '
'
+ERROR =
+ [ '' | '"' ] STRING ''
+
+VARREF =
+ ''
FUNCALL =
- '' TERM * ''
- | '<' 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 =
- '0'
-FALSE =
- '1'
-
-;; 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.
+ '' TERM * ''
+ | PREDEFINED
+
+PREDEFINED =
+ SET
+ | AND | OR | NOT | EQ | NOTEQ | EQUAL | MATCH
+ | LT | LE | GE | GT
+ | 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 | CATCH | THROW
+ | QUOTE | EVAL | TYPE
+
+;; TERM contains an object, and is evaluated to a TERM as below.
+;; INT contains an integer, and is evaluated to itself .
+;; Two integers of the same value are regarded as the same object.
+;; STRING contains a string, and is evaluated to itself.
+;; SYMBOL contains a named symbol, and is evaluated to itself.
+;; Two symbols of the same name are reguarded as the same object.
+;; LIST contains a list and, is evaluated to itself.
+;; ERROR contains an error type symbol and an error message (optional).
+;; VARREF contains a variable, and is evalued to the value of that variable.
+;; FUNCALL contains 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)
+SYMTERM = SYMBOL | VAR (value is SYMBOL) | FUNCALL (return SYMBOL)
+LISTTERM = LIST | VAR (value is LIST) | FUNCALL (return LIST)
+XXXTERM = TERM
+
+;; 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
+;; NUM".
+
+SET = '' XXXTERM ''
+
+;; Set the value of the variable VNAME to XXXTERM, and the value is
+;; XXXTERM.
+
+ADD = '' INTTERM + ''
+ | '' INTTERM + ''
+SUB = '' INTTERM + ''
+ | '' INTTERM + ''
+MUL = '' INTTERM + ''
+ | '' INTTERM + ''
+DIB = '' INTTERM + '
'
+ | '' INTTERM + '
'
+MOD = '' INTTERM INTTERM ''
+ | '' INTTERM ''
+LOGAND = ' INTTERM + ''
+ | '' INTTERM + ''
+LOGIOR = ' INTTERM + ''
+ | '' INTTERM + ''
+LOGXOR = ' INTTERM + ''
+ | '' INTTERM + ''
+LSH = '' INTTERM INTTERM ''
+ | '' INTTERM ''
+LT = '' INTTERM INTTERM ''
+LE = '' INTTERM INTTERM ''
+GE = '' INTTERM INTTERM ''
+GT ='' INTTERM INTTERM ''
+
+EQ = '' XXXTERM + ''
+
+;; If XXXTERMs have the same object, the value is 1. Otherwise the
+;; value is 0.
+
+NOTEQ = '' XXXTERM XXXTERM ''
+
+;; If XXXTERMs have the same object, the value is 0. Othersise the
+;; value is 1.
+
+APPEND = '' XXXTERM + ''
+ | '' XXXTERM + ''
+
+;; In the first form, the value is a LIST made by concatinating all
+;; elements of XXXTERM (if it is a LIST) or XXXTERM itself (if it is
+;; not a LIST) in the specified order.
+
+;; In the second form, the value of the variable VNAME must be a LIST,
+;; and that LIST is modified destructively by concatinating ANYterms
+;; in the same manner as the previous case. The value is the
+;; resulting LIST.
+
+CONCAT = '' [ STRTERM | INTTERM | LISTTERM ] + ''
+ | '' [ STRTERM | INTTERM | LISTTERM ] + ''
+
+;; In the first form, the value is a STR made by concatinating all
+;; the strings made from the arguments as below:
+;; STRTERM gives a string contained in it.
+;; INTTERM gives a string of a character whose code is INTTERM's integer.
+;; LISTTERM must contain only INTTERMs, and give a string containing
+;; characters whose codes are INTTERM's integer.
+
+;; In the second form, the value of the variable VNAME must be a STR,
+;; and that STR is modified destructively by concatinating the
+;; arguments in the same manner as the previous case. The value is
+;; the resulting STR.
+
+LENGTH = '' [ STRTERM | LISTTERM ] ''
+NTH = '' INTTERM [ STRTERM | LISTTERM ] ''
+COPY = '' LISTTERM ''
+INS = '' INTTERM [ STRTERM | LISTTERM ] ''
+DEL = '' INTTERM INTTERM ''
+
+AND = '' TERM + ''
+
+;; Evaluates TERMs one by one until one is evaluated to 0. If none is
+;; evaluated to 0, the value is 1. Othersise the value is 0.
+
+OR = '' TERM + ''
+
+;; Evaluates TERMs one by one until one is evaluated not to 0. If
+;; none is evaluated not to 0, the value is 0. Othersise the value is
+;; 1.
+
+NOT = '' XXXTERM ''
+
+;; If XXX is 0, the value is 1. Othersise the value is 0.
+
+EQUAL = '' XXXTERM1 XXXTERM2 ''
+
+;; If XXX1 equals to XXX2, the value is 1. Otherwise the value is 0.
+;; The equality of terms is decided as below:
+;; INT: INT1 equals to INT2 iff they contain the same integer values.
+;; STR: STR1 equals to STR2 iff they contain strings of the same characters.
+;; SYM: SYM1 equals to SSYM2 iff they contain the same symbol.
+;; LIST: LIST1 equals to LIST2 iff they have the same length, and
+;; the Nth element of LIST1 equals to the Nth element of LIST2.
+
+MATCH = '' XXXTERM1 XXXTERM2 <'/match>'
+
+;; If XXX1 matches with XXX2, the value is 1. Otherwise the value is
+;; 0. Two terms match as below:
+;; INT: INT1 matches with INT2 iff they contain the same integer values.
+;; STR: STR1 matches with STR2 iff STR1's string is a valid regular
+;; expression matching with STR2's string
+;; SYM: SYM1 matches with SSYM2 iff they contain the same symbol.
+;; LIST: LIST1 matches with LIST2 iff LIST1 is not longer than
+;; LIST2, and Nth element of LIST1 equals to Nth element of LIST2.
+;; ERROR: ERROR1 matches with ERROR2 iff ERROR1's error type is
+;; or is the same as ERROR2's error type.
+
+PROGN = '' TERM * ''
+IF = '' TERM TERM TERM ? ''
+WHEN = '' TERM TERM * ''
+COND = '' LIST + ''
+LOOP = '' TERM + ''
+WHILE = '' TERM + ''
+FOREACH = '' [STRTERM | LISTTERM] TERM + ''
+BREAK = '' TERM ? ''
+RETURN = '' TERM ? ''
+QUOTE = '' TERM '
'
+
+CATCH = '' [ SYMBOL | ERROR ] TERM + ''
+ | '' [ SYMBOL | ERROR ] TERM + ''
+
+;; Evaluate TERMs one by one until a term matching with the specified
+;; SYMBOL or ERROR is thrown by . If thrown, the value is 1,
+;; otherwise the value is 0. If VNAME is specified, its value is set
+;; to the last evaluated term. It is the value of if thrown.
+
+THROW = '' SYMBOL XXXTERM ? ''
+ | '' ERROR ''
+
+;; Throw to the catch for SYMBOL or ERROR. The value is XXXTERM (if
+;; any) or SYMBOL in the first form, and ERROR in the second form.
+
+EVAL = '' TERM ''
+
+TYPE = '' XXXTERM ''
+
+;; The value is SYM representing the type of XXXTERM as below:
+;; INT: the type is integer
+;; STR: the type is string
+;; SYM: the type is symbol
+;; LIST: the type is list
+;; ERROR: the type is error