示例#1
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);
        }
示例#2
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);
 }
示例#3
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);
        }
示例#4
0
 public static int get_type(object[] o)
 {
     return(YDEF.get_type(o));
 }
示例#5
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);
        }