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"); } }
//-- 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 }); } } }
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); }
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); }
/* * 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); }
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); }
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); }
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); } } }
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); }
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); }
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); }
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); }
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); }
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); }