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); }
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); }
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); }
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 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); }
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); }