예제 #1
0
파일: runtime_util.cs 프로젝트: iruka-/slag
        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);
        }
예제 #2
0
파일: runtime_util.cs 프로젝트: iruka-/slag
        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);
        }
예제 #3
0
파일: runtime_util.cs 프로젝트: iruka-/slag
        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");
            }
        }
        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);
        }
예제 #5
0
파일: runtime_util.cs 프로젝트: iruka-/slag
 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);
 }
예제 #6
0
파일: runtime_util.cs 프로젝트: iruka-/slag
        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);
        }
        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);
        }
예제 #8
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);
        }