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); }
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); }
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 int get_type(object[] o) { return(YDEF.get_type(o)); }
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); }