*** empty log message ***
authorhanda <handa>
Thu, 1 Oct 2009 00:12:01 +0000 (00:12 +0000)
committerhanda <handa>
Thu, 1 Oct 2009 00:12:01 +0000 (00:12 +0000)
MInputMethod.cs
XmlExpr.cs
input.txt
xex.xml

index ee54f6d..918fea5 100644 (file)
@@ -163,10 +163,8 @@ namespace M17N.Input
        return c | (uint) modifiers;
       }
 
-      public Key (uint c)
-      {
-       key = c;
-      }
+      public Key (uint c) { key = c; }
+      public Key (int c) { key = (uint) c; }
 
       public Key (uint c, KeyModifier modifiers)
       {
@@ -350,35 +348,37 @@ namespace M17N.Input
        return 0;
       }
 
-      public KeySeq (XmlNode node)
+      public KeySeq (Xex.Term arg)
        {
-         XmlAttributeCollection acol = node.Attributes;
-         XmlNode n;
-
-         if (acol != null && (n = acol["keys"]) != null)
+         if (arg.IsStr)
            {
-             foreach (char c in  n.Value)
-               keyseq.Add (new Key ((uint) c));
-           }
+             string str = arg.Strval;
 
-         for (node = node.FirstChild; node != null; node = node.NextSibling)
+             for (int i = 0; i < str.Length; i++)
+               keyseq.Add (new Key (str[i]));
+           }
+         else if (arg.IsList)
            {
-             if (node.Name == "key-event")
-               keyseq.Add (new Key ((MSymbol) node.InnerText));
-             else
-               keyseq.Add (new Key (parse_integer (node.InnerText)));
+             List<Xex.Term> list = arg.Listval;
+             int len = list.Count;
+
+             for (int i = 0; i < len; i++)
+               {
+                 if (list[i].IsInt)
+                   keyseq.Add (new Key (list[i].Intval));
+                 else if (list[i].IsStr)
+                   keyseq.Add (new Key (list[i].Strval));
+                 else if (list[i].IsSymbol)
+                   keyseq.Add (new Key ((string) list[i].Symval));
+                 else
+                   throw new Exception ("Invalid key: " + list[i]);
+               }
            }
        }
 
-      public KeySeq (Xex.Term[] args)
+      public static Xex.TermValue New (Xex.Domain domain, XmlNode node)
        {
-         foreach (Xex.Term term in args)
-           {
-             if (term.IsSymbol)
-               keyseq.Add (new Key ((MSymbol) ((string) term.Symval)));
-             else
-               keyseq.Add (new Key (term.Strval));
-           }
+         return new KeySeq (new Xex.Term (domain, node.FirstChild));
        }
 
       public override string ToString ()
@@ -525,7 +525,10 @@ namespace M17N.Input
            if (node.Name == "description")
              description = parse_description (node);
            else if (node.Name == "keyseq")
-             keys.Add (new KeySeq (node));
+             {
+               KeySeq ks = MInputMethod.KeySeq.New (domain, node);
+               keys.Add (ks);
+             }
          }
       }
 
@@ -811,6 +814,8 @@ namespace M17N.Input
 
     static MInputMethod ()
     {
+      im_domain.DefType ("keyseq", KeySeq.New);
+
       im_domain.DefSubr (Finsert, "insert", true, 1, 1);
       im_domain.DefSubr (Finsert_candidates, "candidates", true, 1, -1);
       im_domain.DefSubr (Fdelete, "delete", true, 1, 1);
@@ -827,7 +832,6 @@ namespace M17N.Input
       im_domain.DefSubr (Fshift, "shift", true, 1, 1);
       im_domain.DefSubr (Fmarker, "marker", true, 1, 1);
       im_domain.DefSubr (Fchar_at, "char-at", true, 1, 1);
-      im_domain.DefSubr (Fkeyseq, "keyseq", true, 1, -1);
 
       MDatabase.Tag tag = new MDatabase.Tag (Minput_method, "*", "*", "*");
       List<MDatabase> list = MDatabase.List (tag);
@@ -1746,12 +1750,6 @@ namespace M17N.Input
       return args[0];
     }
 
-    private static Xex.Term Fkeyseq (Xex.Domain domain, Xex.Variable vari,
-                                    Xex.Term[] args)
-    {
-      return new Xex.Term (new KeySeq (args));
-    }
-
     private static Xex.Term Fpushback (Xex.Domain domain, Xex.Variable vari,
                                       Xex.Term[] args)
     {
index 6337449..4646dec 100644 (file)
@@ -83,6 +83,7 @@ namespace System.Xml.Expression
 
     private static Symbol Nexpr = "expr";
 
+    private static Symbol Nnull = "";
     private static Symbol Nfuncall = "funcall";
     private static Symbol Nvarref = "varref";
     private static Symbol Ninteger = "integer";
@@ -264,7 +265,7 @@ namespace System.Xml.Expression
            {
              body = new Term[nterms];
              for (nterms = 0; node != null; node = node.NextSibling, nterms++)
-               body[nterms] = new Term (node, domain);
+               body[nterms] = new Term (domain, node);
            }
        }
 
@@ -616,6 +617,8 @@ namespace System.Xml.Expression
       public object context;
       public int depth = 0;
 
+      internal Dictionary<Symbol, TermType> termtypes
+       = new Dictionary<Symbol, TermType> ();
       internal Dictionary<Symbol, Function> functions
        = new Dictionary<Symbol, Function> ();
       internal Dictionary<Symbol, Variable> variables
@@ -690,6 +693,11 @@ namespace System.Xml.Expression
          }
       }
 
+      public void DefType (Symbol name, NewObject new_object)
+      {
+       termtypes[name] = new TermType (name, new_object);
+      }
+
       public void DefSubr (Builtin builtin, string str, bool setvar,
                           int min_arg, int max_arg, params string[] aliases)
       {
@@ -767,15 +775,10 @@ namespace System.Xml.Expression
          desc = null;
        if (node != null)
          {
-           XmlNode nn;
-           if (node.Name == "value")
-             nn = node.FirstChild;
-           else
-             nn = node;
-           Symbol type = nn.Name;
+           Symbol type = node.Name;
            XmlNodeList range_list = null;
            int nranges = 0;
-           string val = nn.InnerText;
+           string val = node.InnerText;
 
            node = node.NextSibling;
            if (node != null)
@@ -989,6 +992,8 @@ namespace System.Xml.Expression
 
     static Xexpression ()
     {
+      basic.DefType ("funcall", Funcall.New);
+
       basic.DefSubr (Fset, "set", true, 1, 1, "=");
       basic.DefSubr (Fnot, "not", false, 1, 1, "!");
       basic.DefSubr (Fadd, "add", true, 1, -1, "+");
@@ -1015,6 +1020,7 @@ namespace System.Xml.Expression
       basic.DefSubr (Feval, "eval", false, 1, 1);
       basic.DefSubr (Fbreak, "break", false, 0, 1);
       basic.DefSubr (Freturn, "return", false, 0, 1);
+
       basic.DefSpecial (Fand, "and", 1, -1, "&&");
       basic.DefSpecial (For, "or", 1, -1, "||");
       basic.DefSpecial (Fprogn, "progn", 0, -1, "expr");
@@ -1533,6 +1539,20 @@ namespace System.Xml.Expression
       return (args.Length == 1 ? Zero : args[1]);
     }
 
+    public delegate TermValue NewObject (Domain domain, XmlNode node);
+
+    public class TermType
+    {
+      public readonly Symbol type;
+      internal readonly NewObject New;
+
+      public TermType (Symbol type, NewObject new_object)
+      {
+       this.type = type;
+       New = new_object;
+      }
+    }
+
     public abstract class TermValue
     {
       public virtual Term Eval (Domain domain) { return new Term (this); }
@@ -1552,28 +1572,6 @@ namespace System.Xml.Expression
          this.args = args;
        }
 
-      public Funcall (XmlNode node, Domain domain)
-       {
-         vari = null;
-         Symbol name = node.Name;
-
-         if (name == Nfuncall)
-           name = node.Attributes[0].Value;
-         else if (node.Attributes[Nvname] != null)
-           vari = domain.GetVar (node.Attributes[Nvname].Value, true);
-         func = domain.GetFunc (name);
-         XmlNodeList nlist = node.ChildNodes;
-         int nargs = nlist.Count;
-
-         if (nargs < func.min_arg
-             || (func.max_arg >= 0 && nargs > func.max_arg))
-           throw new Exception ("Invalid number of arguments to: "
-                                + name + " " + nargs);
-         args = new Term[nargs];
-         for (int i = 0; i < nlist.Count; i++)
-           args[i] = new Term (nlist[i], domain);
-       }
-
       public Funcall (Domain domain, Symbol fname, Term[] args)
        {
          func = domain.GetFunc (fname);
@@ -1583,8 +1581,34 @@ namespace System.Xml.Expression
       public Funcall (Domain domain, Symbol fname, Symbol vname, Term[] args)
        {
          func = domain.GetFunc (fname);
-         vari = domain.GetVar (vname, true);
+         int nargs = args.Length;
+         if (nargs < func.min_arg
+             || (func.max_arg >= 0 && nargs > func.max_arg))
+           throw new Exception ("Invalid number of arguments to: "
+                                + fname + " " + nargs);
          this.args = args;
+         if (vname != Nnull)
+           vari = domain.GetVar (vname, true);
+       }
+
+      internal static TermValue New (Domain domain, XmlNode node)
+       {
+         Symbol fname = node.Name;
+         Symbol vname = Nnull;
+         XmlAttribute attr;
+
+         if (fname == Nfuncall)
+           fname = node.Attributes[Nfname].Value;
+         attr = node.Attributes[Nvname];
+         if (attr != null)
+           vname = attr.Value;
+
+         XmlNodeList nlist = node.ChildNodes;
+         int nargs = nlist.Count;
+         Term[] args = new Term[nargs];
+         for (int i = 0; i < nargs; i++)
+           args[i] = new Term (domain, nlist[i]);
+         return new Funcall (domain, fname, vname, args);
        }
 
       public override Term Eval (Domain domain)
@@ -1629,7 +1653,7 @@ namespace System.Xml.Expression
       public Term (Term term) { intval = term.intval; objval = term.objval; }
       public Term (TermValue obj) { intval = 0; objval = obj; }
 
-      public Term (XmlNode node, Domain domain)
+      public Term (Domain domain, XmlNode node)
        {
          Symbol name = node.Name;
 
@@ -1652,11 +1676,18 @@ namespace System.Xml.Expression
                  List<Term> list = new List<Term> ();
                  for (node = node.FirstChild; node != null;
                       node = node.NextSibling)
-                   list.Add (new Term (node, domain));
+                   list.Add (new Term (domain, node));
                  objval = list;
                }
              else
-               objval = new Funcall (node, domain);
+               {
+                 TermType term_type;
+
+                 if (domain.termtypes.TryGetValue (name, out term_type))
+                   objval = term_type.New (domain, node);
+                 else
+                   objval = Funcall.New (domain, node);
+               }
            }
        }
 
@@ -1864,7 +1895,7 @@ namespace System.Xml.Expression
            if (n.Name == Ndefun)
              domain.Defun (n, false);
            else if (n.Name != Ndefvar)
-             terms[i++]= new Term (n, domain);
+             terms[i++]= new Term (domain, n);
          }
     }
 
index 628c73a..a1ba964 100644 (file)
--- a/input.txt
+++ b/input.txt
@@ -55,10 +55,10 @@ PREDEFINED += MIM-PREDEFEIND
 
 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>' SYMBOL '</marker>'
 MARKERTERM = MARKER | VAR (value is MARKER) | FUNCALL (return MARKER)
 
 SELECTOR = '<selector>' SYMTERM '</selector>'
diff --git a/xex.xml b/xex.xml
index 476c1ed..4462666 100644 (file)
--- a/xex.xml
+++ b/xex.xml
@@ -56,7 +56,7 @@
     </cond>
     <foreach vname="a">
       <list><integer>10</integer><integer>11</integer></list>
-      <add vname="x"><varref vname="a"/></add>
+      <funcall fname="add" vname="x"><varref vname="a"/></funcall>
     </foreach>
     <varref vname="x"/>
     <eval><varref vname="x"/></eval>
     <concat><integer>?a</integer><integer>?b</integer></concat>
     <quote><add><varref vname="x"/><integer>1</integer></add></quote>
   </append>
-  <set vname="count"><integer>0</integer></set>
-  <loop>
-    <set vname="l"><copy><list><symbol>k</symbol></list></copy></set>
-    <append vname="l"><symbol>a</symbol></append>
-    <add vname="count"><integer>1</integer></add>
-    <if><ge><varref vname="count"/><integer>4</integer></ge>
-       <break><symbol>broken</symbol></break>
-    </if></loop>
-  <varref vname="l"/>
 </expr>