STATELIST ?
'</input-method>'
-VARLIST = '<variable-list>' DEFVAR * '</variable-list>'
-CMDLIST = '<command-list>' COMMAND * '</command-list>'
-MODULELIST = '<module-list>' MODULE * '</module-list>'
-MACROLIST = '<macro-list>' DEFUN * '</macro-list>'
-MAPLIST = '<map-list>' MAP * '</map-list>'
-STATELIST = '<state-list>' STATE * '</state-list>'
+TAGS = '<tags>' LANG NAME EXTRA ? '</tags>'
-MODULE = '<module>' DEFUN-NAME + '</module>'
-DEFUN-NAME = '<defun fname=">' FNAME '"/>'
+LANG = '<language>' LANGNAME '</language>'
+NAME = '<name>' NAME '</name>'
+EXTRA = '<extra-id>' EXTRANAME '</extra-id>'
-MAP = '<map id="' MAPNAME '">' RULE * '</map>'
+VARLIST = '<variable-list>' DEFVAR + '</variable-list>'
+CMDLIST = '<command-list>' COMMAND + '</command-list>'
+MODULELIST = '<module-list>' MODULE + '</module-list>'
+MACROLIST = '<macro-list>' DEFUN + '</macro-list>'
+MAPLIST = '<map-list>' MAP + '</map-list>'
+STATELIST = '<state-list>' STATE + '</state-list>'
-RULE = '<rule>' [ KEYSEQ | COMMAND-REF ] FUNCALL * '</rule>'
+MODULE = '<module id="' MODULENAME '">' DEFUN-NAME + '</module>'
+DEFUN-NAME = '<defun fname="' FNAME '"/>'
-STATE = '<state id="' STATENAME '">' BRANCH * '</state>'
+COMMAND
+ = '<defcmd cname="' COMMANDNAME '">'
+ DESCRIPTION ?
+ KEYSEQ *
+ '</defcmd>'
-BRANCH = ...
+MAP = '<map mname="' MAPNAME '">' RULE * '</map>'
+
+RULE = '<rule>' [ KEYSEQ | CMDREF ] FUNCALL * '</rule>'
+
+CMDREF = '<command cname="' COMMANDNAME '"/>'
+
+STATE = '<state sname="' STATENAME '">'
+ TITLE ?
+ [ HOOK BRANCH CATCHALL ] *
+ '</state>'
+
+HOOK = '<state-hook>' FUNCALL + '</state-hook>'
+
+BRANCH = '<branch mname="' MAPNAME '">' FUNCALL * '</branch>'
+
+CATCHALL = '<catch-all-branch>' FUNCALL * '</catch-all-branch>'
TERM += MIM-TERM
PREDEFINED += MIM-PREDEFEIND
-MIM-TERM = KEYSEQ MARKER
+MIM-TERM = KEYSEQ | MARKER | SELECTOR
-KEYSEQ = '<keyseq>' [ INTTERM | STRTERM | SYMTERM ] + '</keyseq>'
+KEYSEQ = '<keyseq>' [ STRTERM | LISTTERM ] '</keyseq>'
KEYSEQTERM = KEYSEQ | VAR (value is KEYSEQ) | FUNCALL (return KEYSEQ)
-MARKER = '<marker>' SYMTERM '</marker>'
+MARKER = '<marker>' STRING '</marker>'
MARKERTERM = MARKER | VAR (value is MARKER) | FUNCALL (return MARKER)
+SELECTOR = '<selector>' "@..." '</selector>'
+SELECTORTERM = SELECTOR | VAR (value is SELECTOR) | FUNCALL (return SELECTOR)
-MIM-PREDEFINED = MARK MOVE PUSHBACK ...
+MIM-PREDEFINED
+ = INSERT | CANDIDATES | DELETE | SELECT | SHOW | HIDE
+ | MARK | MOVE | PUSHBACK | POP | UNDO | COMMIT | UNHANDLE
+ | SHIFT | SHIFTBACK | CHAR-AT | KEY-COUNT | SURROUNDING-TEXT-FLAG
+INSERT = '<insert>' [ INTTERM | STRTERM ] '</insert>'
+CANDIDATES = '<insert-candidates>' [ STRTERM | LISTTERM ]+ '</insert-candiates>'
+DELETE = '<delete>' [ MARKERTERM | INTTERM ] '</delete>'
+SELECT = '<select>' [ SELECTORTERM | INTTERM ] '</select>'
+SHOW = '<show-candidates/>'
+HIDE = '<hide-candidates/>'
MOVE = '<move>' [ MARKERTERM | INTTERM ] '</move>'
MARK = '<mark>' MARKERTERM '</mark>'
PUSHBACK = '<pushback>' [ KEYSEQTERM | INTTERM ] '</pushback>'
-...
+POP = '<pop/>'
+UNDO = '<undo>' INTTERM ? '</undo>'
+COMMIT = '<commit/>'
+UNHANDLE = '<unhandle/>'
+SHIFT = '<shift>' SYMTERM '</shift>'
+SHIFTBACK = '<shiftback/>'
+CHAR-AT = '<char-at>' MARKERTERM '</char-at>'
+ => <integer>C</integer>, where C is the character in the preedit text
+ or the surrounding text at the postion specified by MARKERTERM.
+KEY-COUNT = '<key-count/>'
+ => <integer>N</integer>, where N is the number of currently handled keys
+SURROUNDING-TEXT-FLAG = '<surrounding-text-flag/>'
+ => <integer>1</integer> if surrounding text handling is supported
+ or <integer>0</integer> if not.