Exemple #1
0
        private static void check_case(YVALUE v)
        {
            if (v.IsType(YDEF.sx_case_clause))
            {
                // ok!  なんでもOKとする。

#if obs
                var expr = v.list_at(1);
                if (expr.IsType(YDEF.QSTR) || expr.IsType(YDEF.NUM))
                {
                    ;//ok
                }
                else
                {
                    _error("unexpected case sentence");
                }
#endif
            }
            else if (v.IsType(YDEF.sx_default_clause))
            {
                ; //ok
            }
            else if (v.IsType(YDEF.sx_sentence))
            {
                ;//ok
            }
            else
            {
                _error("unexpected switch senetence");
            }
        }
Exemple #2
0
 //-- util for this class
 void callfunc(YVALUE func)
 {
     if (func != null && m_slag != null)
     {
         if (slagtool.sys.USETRY)
         {
             try {
                 m_slag.CallFunc(func, new object[1] {
                     this
                 });
             } catch (System.Exception e)
             {
                 slagtool.sys.logline("--- 例外発生 ---");
                 slagtool.sys.logline(e.Message);
                 slagtool.sys.log_stopinfo();
                 slagtool.sys.logline("----------------");
             }
         }
         else
         {
             m_slag.CallFunc(func, new object[1] {
                 this
             });
         }
     }
 }
Exemple #3
0
        private static StateBuffer _callFunction(YVALUE fv, List <object> ol, StateBuffer sb)
        {
            var nsb = sb;

            YDEF_DEBUG.funcCntSmp++;
            nsb.set_funcwork();
            {
                var fvbk = util.normalize_func_bracket(fv.list_at(1).list_at(1)); //ファンクション定義部の引数部分
                if (
                    ((fvbk != null && ol != null) && (((fvbk.list.Count + 1) / 2) != ol.Count))
                    )
                {
                    util._error("number of arguments in valid.");
                }
                int n = 0;
                if (fvbk != null)
                {
                    for (int i = 0; i < fvbk.list.Count; i += 2)
                    {
                        var    varname = fvbk.list_at(i).GetString();//定義側の変数名
                        object o       = ol != null && n < ol.Count ? ol[n] : null;
                        nsb.define(varname, o);
                        n++;
                    }
                }
                nsb = runtime.run_script.run(fv.list_at(2), nsb);
                nsb.breaknone();
            }
            nsb.reset_funcwork();
            YDEF_DEBUG.funcCntSmp--;

            return(nsb);
        }
Exemple #4
0
        internal static YVALUE check_switch_sentence_block(YVALUE v)
        {
            if (v.type != YDEF.get_type(YDEF.sx_sentence_block))
            {
                throw new System.Exception("unexpected switch block #1");
            }
            var inblock = v.list_at(1);

            if (inblock.type == YDEF.get_type(YDEF.sx_sentence))
            {
                check_case(inblock);
                return(v);
            }
            if (inblock.type == YDEF.get_type(YDEF.sx_sentence_list))
            {
                var list = inblock.list_at(0);
                for (int i = 0; i < list.list.Count; i++)
                {
                    check_case(list.list_at(i));
                }
                return(v);
            }
            _error("unexpected switch block #2");
            return(null);
        }
        public static StateBuffer run_qstr(YVALUE v, StateBuffer sb)
        {
            var nsb  = sb;
            var item = nsb.m_pvitem;

            item.o       = v.GetString();
            nsb.m_pvitem = item;
            return(nsb);
        }
Exemple #6
0
 /*
  *  UnityのSendMessage似た動作をする機能
  *
  *  スクリプト
  *
  *  function $_hoge($bhv) //引数bhvは本クラス
  *  {
  *      PrintLn("called");
  *  }
  *
  *  var $go = new GameObject();
  *  var $hv = AddBehaviour($go);       ---- 当コンポネント追加
  *  $hv.AddMsgFunc("xyz",$_hoge);      ---- $_hoge関数を "xyz"として登録
  *   :
  *   :
  *  SendMsg($go, "xyz");         --- GameObjectに対してSendMessageを送信。xyz名で定義された関数($_hoge)が呼び出される
  */
 public void AddMsgFunc(string name, YVALUE func)
 {
     if (m_msgfunctable == null)
     {
         m_msgfunctable = new Hashtable();
     }
     name = name.ToUpper();
     m_msgfunctable[name] = func;
 }
        public static StateBuffer run_num(YVALUE v, StateBuffer sb)
        {
            var nsb  = sb;
            var item = nsb.m_pvitem;

            item.o       = v.GetNumber();
            nsb.m_pvitem = item;
            return(nsb);
        }
        public static StateBuffer run_runtype(YVALUE v, StateBuffer sb)
        {
            var nsb  = sb;
            var item = nsb.m_pvitem;

            item.o       = v.o;
            nsb.m_pvitem = item;
            return(nsb);
        }
Exemple #9
0
        public void Update(float deltaTime)
        {
            if (m_waitcnt > 0)
            {
                m_waitcnt--;
                return;
            }
            if (m_waittime > 0)
            {
                m_waittime -= deltaTime;
                return;
            }

            bool bFirst = false;

            if (m_next != null)
            {
                if (m_cur != null)
                {
                    wk.Log("!" + m_cur + " elapsed " + dbg_elapsedtime + " sec ! (wo synctime)");
                }
                dbg_elapsedtime = 0;
                m_cur           = m_next;
                m_next          = null;
                bFirst          = true;
            }
            if (m_slag != null && m_cur != null)
            {
                var save = Time.realtimeSinceStartup;
                if (sys.USETRY)
                {
                    try {
                        m_slag.CallFunc(m_cur, new object[2] {
                            m_owner, bFirst
                        });
                    }
                    catch (System.Exception e)
                    {
                        slagtool.sys.logline("--- 例外発生 ---", true);
                        slagtool.sys.logline(e.Message, true);
                        slagtool.sys.log_stopinfo();
                        slagtool.sys.logline("----------------", true);
                    }
                }
                else
                {
                    m_slag.CallFunc(m_cur, new object[2] {
                        m_owner, bFirst
                    });
                }
                dbg_elapsedtime += Time.realtimeSinceStartup - save;
            }
        }
        public static StateBuffer run_array_value(StateBuffer sb, YVALUE v, object index_o)
        {
            var nsb = sb;

            nsb = run_script.run(v, nsb);
            var item = nsb.m_pvitem;

            if (item.getter != null)
            {
                item.o = item.getter();
            }
            if (item.o != null)
            {
                if (item.o.GetType().IsArray)
                {
                    var i = (int)util.ToNumber(index_o);
                    var a = (Array)item.o;
                    item.o = a.GetValue(i);

                    nsb.m_pvitem = item;
                    return(nsb);
                }
                if (item.o.GetType() == typeof(LIST))
                {
                    var i = (int)util.ToNumber(index_o);
                    var l = (LIST)item.o;
                    item.o = l[i];

                    nsb.m_pvitem = item;
                    return(nsb);
                }
                if (item.o.GetType() == typeof(Hashtable))
                {
                    var ht = (Hashtable)item.o;
                    item.o = ht[index_o];

                    nsb.m_pvitem = item;
                    return(nsb);
                }
                if (item.o is string)
                {
                    var i = (int)util.ToNumber(index_o);
                    var s = (string)item.o;
                    item.o = s[i];

                    nsb.m_pvitem = item;
                    return(nsb);
                }
            }
            util._error("unexpected");
            return(null);
        }
        public static StateBuffer run_name(YVALUE v, StateBuffer sb)
        {
            var            nsb    = sb;
            var            name   = v.GetString();
            PointervarItem item   = nsb.m_pvitem;
            var            preobj = item.o; //先行ロケーションアイテムの値

            if (preobj == null)             //先行値がないのでNAMEとしてバッファを検索し、なければリテラルとして処理を以降に任せる
            {
                if (nsb.exist(name))
                {
                    item.o = nsb.get(name);
                }
                else
                {
                    var literal = new Literal();
                    literal.s = name;
                    item.o    = literal;
                }
                nsb.m_pvitem = item;

                return(nsb);
            }
            var pretype = preobj.GetType();

            if (pretype == typeof(Literal))
            {
                var literal = (Literal)preobj;
                item         = GetObj(literal.s, name, item);
                nsb.m_pvitem = item;
                return(nsb);
            }

            if (pretype == typeof(Hashtable))
            {
                var ht    = (Hashtable)preobj;
                var nameo = name.ToUpper();
                item.o      = ht[nameo];
                item.getter = () => ht[nameo];
                item.setter_parametertype = null;
                item.setter  = (x) => ht[nameo] = x;
                nsb.m_pvitem = item;
                return(nsb);
            }

            item         = GetObj(preobj, name, item);
            nsb.m_pvitem = item;
            return(nsb);
        }
        public static StateBuffer run_new_func(YVALUE v, StateBuffer sb)
        {
            var nsb  = sb;
            var item = new PointervarItem(); //先行アイテム。中身なし

            item.mode = PointervarMode.NEW;

            nsb.m_pvitem = item;

            nsb = run_script.run(v, nsb.curnull());

            nsb.m_cur = nsb.m_pvitem.o;
            nsb.pvitemnull();

            return(nsb);
        }
Exemple #13
0
 internal static bool is_paramlist(YVALUE v)
 {
     if (v.type == YDEF.get_type(YDEF.sx_expr))
     {
         if (v.list.Count >= 3)
         {
             for (int i = 1; i < v.list.Count; i += 2)
             {
                 if (v.list_at(i).GetString() != ",")
                 {
                     return(false);
                 }
             }
             return(true);
         }
     }
     return(false);
 }
Exemple #14
0
    void callfunc(YVALUE func, object o)
    {
        if (o == null)
        {
            callfunc(func);
            return;
        }

        List <object> ol = null;

        if (o is List <object> )
        {
            ol = (List <object>)o;
        }
        else
        {
            ol = new List <object>();
            ol.Add(o);
        }

        ol.Insert(0, this);

        var oary = ol.ToArray();

        if (func != null && m_slag != null)
        {
            if (slagtool.sys.USETRY)
            {
                try {
                    m_slag.CallFunc(func, oary);
                } catch (System.Exception e)
                {
                    slagtool.sys.logline("--- 例外発生 ---");
                    slagtool.sys.logline(e.Message);
                    slagtool.sys.log_stopinfo();
                    slagtool.sys.logline("----------------");
                }
            }
            else
            {
                m_slag.CallFunc(func, oary);
            }
        }
    }
Exemple #15
0
        internal static YVALUE GetOptimize(YVALUE v)
        {
            YVALUE findV = v;

            Action <YVALUE> trv = null;

            trv = (w) => {
                if (w.list_size() == 1)
                {
                    findV = w;
                    trv(w);
                }
                else
                {
                    return;
                }
            };

            return(findV);
        }
Exemple #16
0
 internal static YVALUE ChangeIfType(YVALUE v, List <string> prefixlist)
 {
     if (v.IsType(YDEF.NAME))
     {
         var  vname = v.FindValueByTravarse(YDEF.NAME);
         var  n     = vname.GetString();
         Type type  = GetPrimitiveType(n);
         if (type == null)
         {
             type = Check(vname.GetString(), prefixlist);
         }
         if (type != null)
         {
             vname.type = YDEF.RUNTYPE;
             vname.o    = type;
             vname.s    = type.ToString();
         }
     }
     return(v);
 }
Exemple #17
0
 internal static StateBuffer CallFunction(YVALUE fv, List <object> ol, StateBuffer sb)
 {
     if (sb.m_bExit)
     {
         return(sb);
     }
     try {
         sb = _callFunction(fv, ol, sb);
     } catch (SystemException e)
     {
         if (e.Message == "EXIT" && sb.m_bExit)
         {
             //OK!
         }
         else
         {
             throw new SystemException(e.Message);
         }
     }
     return(sb);
 }
        public static StateBuffer run_array_var(YVALUE v, StateBuffer sb, string name, object index_o)
        {
            var nsb    = sb;
            var item   = nsb.m_pvitem;
            var preobj = item.o;

            if (preobj == null)
            {
                if (item.mode == PointervarMode.NEW && v.list_at(0).type == YDEF.RUNTYPE)
                {
                    var type = (Type)v.list_at(0).o;
                    item         = ExecuteArrayVar(type, index_o, item); // tbc
                    nsb.m_pvitem = item;
                    return(nsb);
                }

                item.o       = nsb.get(name, index_o);
                nsb.m_pvitem = item;
                return(nsb);

                //throw new SystemException("unexpected");
            }

            var pretype = preobj.GetType();

            if (pretype == typeof(Literal))
            {
                var literal = (Literal)preobj;
                item         = ExecuteArrayVar(literal.s, name, index_o, item);
                nsb.m_pvitem = item;
            }
            else
            {
                item         = ExecuteArrayVar(preobj, name, index_o, item); // tbc
                nsb.m_pvitem = item;
            }
            return(nsb);
        }
Exemple #19
0
        internal static YVALUE normalize_func_bracket(YVALUE v)
        {
            if (v.type != YDEF.get_type(YDEF.sx_expr_bracket))
            {
                _error("unexpected");
            }

            Func <YVALUE, YVALUE> comb = null;

            comb = (w) => {
                if (!is_paramlist(w))
                {
                    return(w);
                }
                var x = comb(w.list_at(0));
                var c = w.list_at(1); //, comma
                var y = w.list_at(2); //
                if (is_paramlist(x))
                {
                    w.list.Clear();
                    w.list.Add(x.list_at(0));
                    w.list.Add(x.list_at(1));
                    w.list.Add(x.list_at(2));
                    w.list.Add(c);
                    w.list.Add(y);
                }
                return(w);
            };

            if (v.list.Count == 3)
            {
                var nv = comb(v.list_at(1));
                return(nv);
            }
            v.list.Clear();
            return(v);
        }
Exemple #20
0
        float dbg_elapsedtime = 0; //時間計測

        public void Goto(YVALUE func)
        {
            m_next = func;
        }
        public static StateBuffer run(YVALUE v, StateBuffer sb, PointervarMode mode = PointervarMode.GET)
        {
            var nsb  = sb;
            var item = new PointervarItem(); //先行アイテム。中身なし

            item.mode = mode;

            nsb.m_pvitem = item;

            var size = v.list_size();

            for (int i = 0; i < size; i++)
            {
                var vn = v.list_at(i);
                if (vn == null)
                {
                    throw new SystemException("Unexpected");
                }

                if (vn.IsType(YDEF.PERIOD))
                {
                    continue;
                }

                item        = nsb.m_pvitem;
                item.setter = null;
                item.getter = null;

                nsb = run_script.run(vn, nsb.curnull());

                item = nsb.m_pvitem;
                if (i < size - 1 && item.o == null) //最後尾前のnull確認。 最後尾のNULLは容認。
                {
                    if (sys.DEBUGMODE)
                    {
                        sys.logline("Null Pointer, but ignored at line:" + v.get_dbg_line(true) + " file:" + v.get_dbg_file());
                    }

                    break;                               //最近の流行りを取り入れてnullだったら後ろは処理しない
                }

                if (i < size - 1)
                {
                    if (item.getter != null)
                    {
                        item.o       = item.getter();
                        nsb.m_pvitem = item;
                    }
                }
            }

            item = nsb.m_pvitem;

            if (item.mode == PointervarMode.SET)
            {
                nsb.m_cur = item;//.setter;
            }
            else if (item.mode == PointervarMode.GET)
            {
                if (item.getter != null)
                {
                    nsb.m_cur = item.getter();
                }
                else
                {
                    nsb.m_cur = item.o;
                }
            }
            else if (item.mode == PointervarMode.NEW)
            {
                nsb.m_cur = item.o;
            }
            else if (item.mode == PointervarMode.ITEM)
            {
                nsb.m_cur = item;
            }
            nsb.pvitemnull();

            return(nsb);
        }
        public static StateBuffer run_func(YVALUE v, StateBuffer sb, string name, List <object> ol)
        {
            var nsb    = sb;
            var item   = nsb.m_pvitem;
            var preobj = item.o; //先行ロケーションアイテムの値

            if (preobj == null)  //先行値がない場合はRUNTYPEがv内にある。
            {
                var vr = v.FindValueByTravarse(YDEF.RUNTYPE);
                if (vr != null && vr.o is Type)
                {
                    var ti = (Type)vr.o;
                    item.o       = runtime.sub_reflection.InstantiateType(ti, ol.ToArray());
                    nsb.m_pvitem = item;
                    return(nsb);
                }
                var fv = (YVALUE)nsb.get_func(name);
                if (fv != null)
                {
                    nsb.m_pvitem = null;
                    nsb          = util.CallFunction(fv, ol, nsb.curnull());
                    item.o       = nsb.m_cur;
                    nsb.m_pvitem = item;
                    return(nsb);
                }
                else
                {
                    if (builtin.builtin_func.IsFunc(name))
                    {
                        nsb.m_pvitem = null;
                        nsb.m_cur    = builtin.builtin_func.Run(name, ol.ToArray(), nsb.curnull());
                        item.o       = nsb.m_cur;
                        nsb.m_pvitem = item;
                        return(nsb);
                    }
                    //util._error("function is not defined:" + name);
                }

                throw new SystemException("unexpected");
            }
            var pretype = preobj.GetType();

            if (pretype == typeof(Literal))
            {
                var literal = (Literal)preobj;
                item         = ExecuteFunc(literal.s, name, ol, item);
                nsb.m_pvitem = item;
            }
            else if (pretype == typeof(Hashtable))
            {
                var ht      = (Hashtable)preobj;
                var n       = name.ToUpper();
                var funcobj = ht[n];
                var nol     = new LIST();
                nol.Add(ht);
                if (ol != null)
                {
                    nol.AddRange(ol);
                }

                if (funcobj != null)
                {
                    if (funcobj is YVALUE)
                    {
                        var fv = (YVALUE)funcobj;
                        nsb.m_pvitem = null;
                        nsb          = util.CallFunction(fv, nol, nsb);
                        item.o       = nsb.m_cur;
                        nsb.curnull();
                        nsb.m_pvitem = item;
                        return(nsb);
                    }
                }
                util._error("ハッシュテーブル内に関数がありません : " + name);
            }
            else
            {
                item = ExecuteFunc(preobj, name, ol, item);
            }
            return(nsb);
        }
Exemple #23
0
        internal static YVALUE _convert(YVALUE v)
        {
            if (v.type == YDEF.get_type(YDEF.sx_expr_clause) && v.list_size() == 2 && v.list_at(0).IsType(YDEF.QSTR))// "using ..."節か?
            {
                var s = v.FindValueByTravarse(YDEF.QSTR).GetString();
                sys.logline(s);

                if (!string.IsNullOrEmpty(s))
                {
                    s = s.Trim('"');
                    var tokens = s.Split(' ');
                    if (tokens.Length >= 2 && tokens[0] == "using")
                    {
                        var a = tokens[1];
                        if (!m_prefix_list.Contains(a))
                        {
                            m_prefix_list.Add(a);//格納
                        }
                    }
                }
                return(v);
            }

            if (v.type == YDEF.get_type(YDEF.sx_pointervar_clause))//ポインタ値節か?
            {
                //中身確認
                //リスト先頭が1要素でNAMEであれば、そのNAMEを調査する
                var vt = v.list_at(0);
                vt        = Checktype.ChangeIfType(vt, m_prefix_list);
                v.list[0] = vt;

#if obs
                //リスト最後尾がfunc要素であれば、引数を対象に
                var ve = v.list_at(v.list.Count - 1);
                if (ve != null && ve.IsType(YDEF.sx_func))
                {
                    var vf = ve.FindValueByTravarse(YDEF.sx_func);
                    var v2 = vf.list_at(1);
                    if (v2 != null)
                    {
                        v2         = _convert(v2);
                        vf.list[1] = v2;
                    }
                }
#endif
                //リスト中にfunc要素があれば、引数を対象に。
                for (int i = 0; i < v.list_size(); i++)
                {
                    var ve = v.list_at(i);
                    if (ve != null && ve.IsType(YDEF.sx_func))
                    {
                        var vf = ve.FindValueByTravarse(YDEF.sx_func);
                        var v2 = vf.list_at(1);
                        if (v2 != null)
                        {
                            v2         = _convert(v2);
                            vf.list[1] = v2;
                        }
                    }
                }

                return(v);
            }
            if (v.type == YDEF.get_type(YDEF.sx_def_func_clause))//ファンクション宣言節か?
            {
                //ファンクション名を対象とせず、本体を対象へ
                var nv = v.list_at(2);
                if (nv != null)
                {
                    _convert(nv);
                }
                return(v);
            }
            if (v.type == YDEF.get_type(YDEF.sx_def_var_clause))//変数宣言節か?
            {
                //  宣言名は対象とせず、アサイン値があれば対象へ
                //var pv = v.list_at(0);
                //if (pv!=null) _convert(pv);
                var nv = v.list_at(2);
                if (nv != null)
                {
                    _convert(nv);
                }
                return(v);
            }
            if (v.type == YDEF.get_type(YDEF.sx_expr) && (v.list_size() == 2 && v.list_at(0).type == YDEF.NEW))//NEW節か?
            {
                //タイプ名かを確認
                var nv = v.list_at(1);
                if (nv.IsType(YDEF.sx_func))
                {
                    var fv    = nv.FindValueByTravarse(YDEF.sx_func);
                    var namev = fv.list_at(0);
                    namev      = Checktype.ChangeIfType(namev, m_prefix_list);
                    fv.list[0] = namev;
                    fv.list[1] = _convert(fv.list[1]);
                }
                else if (nv.IsType(YDEF.sx_pointervar_clause))
                {
                    var pv = nv.FindValueByTravarse(YDEF.sx_pointervar_clause);
                    pv = _convert(pv);
                }
                else if (nv.IsType(YDEF.sx_array_var))
                {
                    var av    = nv.FindValueByTravarse(YDEF.sx_array_var);
                    var namev = av.list_at(0);
                    namev      = Checktype.ChangeIfType(namev, m_prefix_list);
                    av.list[0] = namev;
                    av.list[1] = _convert(av.list[1]);
                }
                return(v);
            }
            //if (v.type == YDEF.get_type(YDEF.sx_func))  ---- ポインタ値に属さない関数は内部または組込関数のみなので、評価外。
            //{
            //
            //}
            if (v.type == YDEF.NAME)
            {
                //タイプ名かを確認

                v = Checktype.ChangeIfType(v, m_prefix_list);

                return(v);
            }

            // vの内部構成が変わるため、インデックスとサイズを確認しながら走査する。
            int index = 0;
            while (v.list != null)
            {
                if (v.list.Count <= index)
                {
                    break;
                }
                var vn = v.list_at(index);
                if (vn == null)
                {
                    continue;
                }

                vn            = _convert(vn);
                v.list[index] = vn;

                index++;
            }
            return(v);
        }