static public int IsValid(IntPtr l) { try { Dsl.ISyntaxComponent self = (Dsl.ISyntaxComponent)checkSelf(l); var ret = self.IsValid(); pushValue(l, true); pushValue(l, ret); return(2); } catch (Exception e) { return(error(l, e)); } }
public IStoryValue <object> CalcValue(Dsl.ISyntaxComponent param) { lock (m_Lock) { if (param.IsValid() && param.GetId().Length == 0) { //处理括弧 Dsl.CallData callData = param as Dsl.CallData; if (null != callData) { switch (callData.GetParamClass()) { case (int)Dsl.CallData.ParamClassEnum.PARAM_CLASS_PARENTHESIS: if (callData.GetParamNum() > 0) { int ct = callData.GetParamNum(); return(CalcValue(callData.GetParam(ct - 1))); } else { //不支持的语法 return(null); } case (int)Dsl.CallData.ParamClassEnum.PARAM_CLASS_BRACKET: { IStoryValue <object> ret = null; IStoryValueFactory factory = GetFactory("jsonarray"); if (null != factory) { try { ret = factory.Build(); ret.InitFromDsl(param); } catch (Exception ex) { GameFramework.LogSystem.Error("value:{0} line:{1} failed.", param.ToScriptString(), param.GetLine()); throw ex; } } return(ret); } default: return(null); } } else { Dsl.FunctionData funcData = param as Dsl.FunctionData; if (null != funcData && funcData.HaveStatement()) { callData = funcData.Call; if (null == callData || !callData.HaveParam()) { IStoryValue <object> ret = null; IStoryValueFactory factory = GetFactory("jsonobject"); if (null != factory) { try { ret = factory.Build(); ret.InitFromDsl(param); } catch (Exception ex) { GameFramework.LogSystem.Error("value:{0} line:{1} failed.", param.ToScriptString(), param.GetLine()); throw ex; } } return(ret); } else { //不支持的语法 return(null); } } else { //不支持的语法 return(null); } } } else { Dsl.CallData callData = param as Dsl.CallData; if (null != callData) { Dsl.CallData innerCall = callData.Call; if (callData.IsHighOrder && callData.GetParamClass() == (int)Dsl.CallData.ParamClassEnum.PARAM_CLASS_PARENTHESIS && ( innerCall.GetParamClass() == (int)Dsl.CallData.ParamClassEnum.PARAM_CLASS_PERIOD || innerCall.GetParamClass() == (int)Dsl.CallData.ParamClassEnum.PARAM_CLASS_BRACKET || innerCall.GetParamClass() == (int)Dsl.CallData.ParamClassEnum.PARAM_CLASS_PERIOD_BRACE || innerCall.GetParamClass() == (int)Dsl.CallData.ParamClassEnum.PARAM_CLASS_PERIOD_BRACKET || innerCall.GetParamClass() == (int)Dsl.CallData.ParamClassEnum.PARAM_CLASS_PERIOD_PARENTHESIS )) { //obj.member(a,b,...) or obj[member](a,b,...) or obj.(member)(a,b,...) or obj.[member](a,b,...) or obj.{member}(a,b,...) -> dotnetcall(obj,member,a,b,...) Dsl.CallData newCall = new Dsl.CallData(); newCall.Name = new Dsl.ValueData("dotnetcall", Dsl.ValueData.ID_TOKEN); newCall.SetParamClass((int)Dsl.CallData.ParamClassEnum.PARAM_CLASS_PARENTHESIS); if (innerCall.IsHighOrder) { newCall.Params.Add(innerCall.Call); newCall.Params.Add(innerCall.GetParam(0)); for (int i = 0; i < callData.GetParamNum(); ++i) { Dsl.ISyntaxComponent p = callData.Params[i]; newCall.Params.Add(p); } } else { newCall.Params.Add(innerCall.Name); newCall.Params.Add(innerCall.GetParam(0)); for (int i = 0; i < callData.GetParamNum(); ++i) { Dsl.ISyntaxComponent p = callData.Params[i]; newCall.Params.Add(p); } } return(CalcValue(newCall)); } else if (callData.GetParamClass() == (int)Dsl.CallData.ParamClassEnum.PARAM_CLASS_PERIOD || callData.GetParamClass() == (int)Dsl.CallData.ParamClassEnum.PARAM_CLASS_BRACKET || callData.GetParamClass() == (int)Dsl.CallData.ParamClassEnum.PARAM_CLASS_PERIOD_BRACE || callData.GetParamClass() == (int)Dsl.CallData.ParamClassEnum.PARAM_CLASS_PERIOD_BRACKET || callData.GetParamClass() == (int)Dsl.CallData.ParamClassEnum.PARAM_CLASS_PERIOD_PARENTHESIS) { //obj.property or obj[property] or obj.(property) or obj.[property] or obj.{property} -> dotnetget(obj,property) Dsl.CallData newCall = new Dsl.CallData(); newCall.Name = new Dsl.ValueData("dotnetget", Dsl.ValueData.ID_TOKEN); newCall.SetParamClass((int)Dsl.CallData.ParamClassEnum.PARAM_CLASS_PARENTHESIS); if (callData.IsHighOrder) { newCall.Params.Add(callData.Call); newCall.Params.Add(callData.GetParam(0)); } else { newCall.Params.Add(callData.Name); newCall.Params.Add(callData.GetParam(0)); } return(CalcValue(newCall)); } } IStoryValue <object> ret = null; string id = param.GetId(); IStoryValueFactory factory = GetFactory(id); if (null != factory) { try { ret = factory.Build(); ret.InitFromDsl(param); } catch (Exception ex) { GameFramework.LogSystem.Error("value:{0} line:{1} failed.", param.ToScriptString(), param.GetLine()); throw ex; } } return(ret); } } }