private void CalcInitValue(Dsl.ISyntaxComponent param) { IStoryValue val = StoryValueManager.Instance.CalcValue(param); if (null != val) { //对初始化即能求得值的函数,不需要再记录函数表达式,直接转换为常量值。 if (val.HaveValue) { SetValue(val.Value); } else { SetProxy(val); } } else if (param is Dsl.ValueData) { string id = param.GetId(); int idType = param.GetIdType(); if (idType == Dsl.ValueData.NUM_TOKEN) { if (id.StartsWith("0x")) { SetValue(uint.Parse(id.Substring(2), System.Globalization.NumberStyles.HexNumber)); } else if (id.IndexOf('.') >= 0 || id.IndexOf('e') > 0 || id.IndexOf('E') > 0) { SetValue(float.Parse(id, System.Globalization.NumberStyles.Float)); } else { SetValue(int.Parse(id, System.Globalization.NumberStyles.Integer)); } } else if (idType == Dsl.ValueData.ID_TOKEN && (id == "true" || id == "false")) { SetValue(id == "true"); } else { SetValue(id); } } else { #if DEBUG string err = string.Format("Unknown value, id:{0} line:{1}", param.GetId(), param.GetLine()); throw new Exception(err); #else GameFramework.LogSystem.Error("Unknown value, id:{0}", param.GetId()); #endif } }
public void Init(Dsl.ISyntaxComponent config, SkillInstance instance) { m_Name = config.GetId(); Dsl.CallData callData = config as Dsl.CallData; if (null != callData) { Load(callData, instance); } else { Dsl.FunctionData funcData = config as Dsl.FunctionData; if (null != funcData) { Load(funcData, instance); } else { Dsl.StatementData statementData = config as Dsl.StatementData; if (null != statementData) { Load(statementData, instance); } else { //error } } } InitProperties(); }
public ISkillTriger CreateTriger(Dsl.ISyntaxComponent trigerConfig, SkillInstance instance) { ISkillTriger triger = null; string type = trigerConfig.GetId(); ISkillTrigerFactory factory = GetFactory(type); if (null != factory) { try { triger = factory.Create(); triger.Init(trigerConfig, instance); } catch (Exception ex) { GameFramework.LogSystem.Error("triger:{0} line:{1} failed.", trigerConfig.ToScriptString(false), trigerConfig.GetLine()); throw ex; } } else { #if !DEBUG GameFramework.LogSystem.Error("CreateTriger failed, type:{0}", type); #endif } if (null != triger) { GameFramework.LogSystem.Debug("CreateTriger, type:{0} triger:{1}", type, triger.GetType().Name); } else { #if !DEBUG GameFramework.LogSystem.Error("CreateTriger failed, type:{0}", type); #endif } return(triger); }
public void Set(Dsl.ISyntaxComponent p) { string val = p.GetId(); int type = p.GetIdType(); if (!string.IsNullOrEmpty(val)) { if (type == Dsl.CallData.NUM_TOKEN) { m_Key = string.Empty; if (val.IndexOf('.') >= 0) { m_Value = Convert.ChangeType(val, typeof(float)); } else { m_Value = Convert.ChangeType(val, typeof(int)); } } else { m_Key = val; } } }
protected override bool Load(Dsl.CallData callData) { Dsl.ISyntaxComponent param1 = callData.GetParam(0); Dsl.ISyntaxComponent param2 = callData.GetParam(1); m_Variables = Calculator.NamedVariables; m_VarId = param1.GetId(); m_Op = Calculator.Load(param2); return(true); }
internal static string GetParamIdAfterRemoveParenthesis(Dsl.ISyntaxComponent comp, int ix, out Dsl.ISyntaxComponent param) { var data = comp as Dsl.FunctionData; if (null != data && data.GetParamNum() > ix) { param = RemoveParenthesis(data.GetParam(ix)); return(param.GetId()); } param = null; return(string.Empty); }
public bool Init(Dsl.ISyntaxComponent config) { m_Comments = m_Params.InitFromDsl(config, 0, true); m_Config = config; m_Id = config.GetId(); if (GameFramework.GlobalVariables.Instance.IsDevice) { //在设备上不保留配置信息了 m_Comments = null; m_Config = null; } return(config is Dsl.FunctionData); }
static public int GetId(IntPtr l) { try { Dsl.ISyntaxComponent self = (Dsl.ISyntaxComponent)checkSelf(l); var ret = self.GetId(); pushValue(l, true); pushValue(l, ret); return(2); } catch (Exception e) { return(error(l, e)); } }
public bool Init(Dsl.ISyntaxComponent config) { bool ret = true; m_Config = config; m_Id = config.GetId(); Dsl.FunctionData funcData = config as Dsl.FunctionData; if (null != funcData) { Load(funcData); } else { Dsl.StatementData statementData = config as Dsl.StatementData; if (null != statementData) { int funcNum = statementData.GetFunctionNum(); var lastFunc = statementData.Last; var id = lastFunc.GetId(); if (funcNum >= 2 && (id == "comment" || id == "comments")) { m_Comments = lastFunc; statementData.Functions.RemoveAt(funcNum - 1); if (statementData.GetFunctionNum() == 1) { funcData = statementData.GetFunction(0); ret = Load(funcData); } else { ret = Load(statementData); } } else { ret = Load(statementData); } } else { //keyword } } if (GameFramework.GlobalVariables.Instance.IsDevice) { //在设备上不保留配置信息了 m_Comments = null; m_Config = null; } return(ret); }
public void InitFromDsl(Dsl.ISyntaxComponent param) { Dsl.ValueData valueData = param as Dsl.ValueData; if (null != valueData) { string id = param.GetId(); int idType = param.GetIdType(); if (idType == Dsl.ValueData.ID_TOKEN && id.StartsWith("$")) { if (0 == id.CompareTo("$$")) { SetArgument(c_Iterator); } else { string idName = id.Substring(1); if (idName.Length > 0 && char.IsDigit(idName[0])) { SetArgument(int.Parse(idName)); } else { SetStack(id); } } } else if (idType == Dsl.ValueData.ID_TOKEN && id.StartsWith("@")) { if (id.StartsWith("@@")) { SetGlobal(id); } else { SetLocal(id); } } else { CalcInitValue(param); } } else { CalcInitValue(param); } }
public void Set(Dsl.ISyntaxComponent p) { string val = p.GetId(); int type = p.GetIdType(); if (!string.IsNullOrEmpty(val)) { if (type == Dsl.FunctionData.NUM_TOKEN) { m_Key = string.Empty; m_Value = (T)Convert.ChangeType(val, typeof(T)); } else { m_Key = val; } } }
internal static string CalcTypeString(Dsl.ISyntaxComponent comp) { string ret = comp.GetId(); var cd = comp as Dsl.FunctionData; if (null != cd && cd.GetParamClass() == (int)Dsl.FunctionData.ParamClassEnum.PARAM_CLASS_PERIOD) { string prefix; if (cd.IsHighOrder) { prefix = CalcTypeString(cd.LowerOrderFunction); } else { prefix = cd.GetId(); } ret = prefix + "." + cd.GetParamId(0); } return(ret); }
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); } } }
public IStoryValue CalcValue(Dsl.ISyntaxComponent param) { lock (m_Lock) { Dsl.FunctionData callData = param as Dsl.FunctionData; if (null != callData && callData.IsValid() && callData.GetId().Length == 0 && !callData.IsHighOrder && (callData.GetParamClass() == (int)Dsl.FunctionData.ParamClassEnum.PARAM_CLASS_PARENTHESIS || callData.GetParamClass() == (int)Dsl.FunctionData.ParamClassEnum.PARAM_CLASS_BRACKET)) { //处理圆括弧与方括弧 switch (callData.GetParamClass()) { case (int)Dsl.FunctionData.ParamClassEnum.PARAM_CLASS_PARENTHESIS: if (callData.GetParamNum() > 0) { int ct = callData.GetParamNum(); return(CalcValue(callData.GetParam(ct - 1))); } else { return(null); } case (int)Dsl.FunctionData.ParamClassEnum.PARAM_CLASS_BRACKET: { IStoryValue ret = null; IStoryValueFactory factory = GetFactory("array"); if (null != factory) { try { ret = factory.Build(); ret.InitFromDsl(param); } catch (Exception ex) { var msg = string.Format("[LoadStory] value:{0} line:{1} failed.", param.ToScriptString(false), param.GetLine()); throw new Exception(msg, ex); } } return(ret); } default: return(null); } } else { Dsl.FunctionData funcData = param as Dsl.FunctionData; if (null != funcData && funcData.HaveStatement()) { //处理大括弧 callData = funcData; if (null == callData || !callData.HaveParam()) { IStoryValue ret = null; IStoryValueFactory factory = GetFactory("hashtable"); if (null != factory) { try { ret = factory.Build(); ret.InitFromDsl(param); } catch (Exception ex) { var msg = string.Format("[LoadStory] value:{0} line:{1} failed.", param.ToScriptString(false), param.GetLine()); throw new Exception(msg, ex); } } return(ret); } else { //不支持的语法 return(null); } } else { if (null != callData) { Dsl.FunctionData innerCall = callData.LowerOrderFunction; if (callData.IsHighOrder && callData.GetParamClass() == (int)Dsl.FunctionData.ParamClassEnum.PARAM_CLASS_PARENTHESIS && ( innerCall.GetParamClass() == (int)Dsl.FunctionData.ParamClassEnum.PARAM_CLASS_PERIOD || innerCall.GetParamClass() == (int)Dsl.FunctionData.ParamClassEnum.PARAM_CLASS_BRACKET || innerCall.GetParamClass() == (int)Dsl.FunctionData.ParamClassEnum.PARAM_CLASS_PERIOD_BRACE || innerCall.GetParamClass() == (int)Dsl.FunctionData.ParamClassEnum.PARAM_CLASS_PERIOD_BRACKET || innerCall.GetParamClass() == (int)Dsl.FunctionData.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,...) string method = innerCall.GetParamId(0); string apiName; if (method == "orderby" || method == "orderbydesc" || method == "where" || method == "top") { apiName = "linq"; } else { apiName = "dotnetcall"; } Dsl.FunctionData newCall = new Dsl.FunctionData(); newCall.Name = new Dsl.ValueData(apiName, Dsl.ValueData.ID_TOKEN); newCall.SetParamClass((int)Dsl.FunctionData.ParamClassEnum.PARAM_CLASS_PARENTHESIS); if (innerCall.IsHighOrder) { newCall.Params.Add(innerCall.LowerOrderFunction); newCall.Params.Add(ObjectMemberConverter.Convert(innerCall.GetParam(0), innerCall.GetParamClass())); 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(ObjectMemberConverter.Convert(innerCall.GetParam(0), innerCall.GetParamClass())); 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.FunctionData.ParamClassEnum.PARAM_CLASS_PERIOD || callData.GetParamClass() == (int)Dsl.FunctionData.ParamClassEnum.PARAM_CLASS_BRACKET || callData.GetParamClass() == (int)Dsl.FunctionData.ParamClassEnum.PARAM_CLASS_PERIOD_BRACE || callData.GetParamClass() == (int)Dsl.FunctionData.ParamClassEnum.PARAM_CLASS_PERIOD_BRACKET || callData.GetParamClass() == (int)Dsl.FunctionData.ParamClassEnum.PARAM_CLASS_PERIOD_PARENTHESIS) { //obj.property or obj[property] or obj.(property) or obj.[property] or obj.{property} -> dotnetget(obj,property) Dsl.FunctionData newCall = new Dsl.FunctionData(); newCall.Name = new Dsl.ValueData("dotnetget", Dsl.ValueData.ID_TOKEN); newCall.SetParamClass((int)Dsl.FunctionData.ParamClassEnum.PARAM_CLASS_PARENTHESIS); if (callData.IsHighOrder) { newCall.Params.Add(callData.LowerOrderFunction); newCall.Params.Add(ObjectMemberConverter.Convert(callData.GetParam(0), callData.GetParamClass())); } else { newCall.Params.Add(callData.Name); newCall.Params.Add(ObjectMemberConverter.Convert(callData.GetParam(0), callData.GetParamClass())); } return(CalcValue(newCall)); } } IStoryValue ret = null; string id = param.GetId(); if (param.GetIdType() == Dsl.ValueData.ID_TOKEN) { IStoryValueFactory factory = GetFactory(id); if (null != factory) { try { ret = factory.Build(); ret.InitFromDsl(param); } catch (Exception ex) { var msg = string.Format("[LoadStory] value:{0}[{1}] line:{2} failed.", id, param.ToScriptString(false), param.GetLine()); throw new Exception(msg, ex); } } else { #if DEBUG string err = string.Format("[LoadStory] value:{0}[{1}] line:{2} failed.", id, param.ToScriptString(false), param.GetLine()); GameFramework.LogSystem.Error("{0}", err); throw new Exception(err); #else GameFramework.LogSystem.Error("[LoadStory] value:{0} line:{1} failed.", id, param.GetLine()); #endif } } return(ret); } } } }
public static void FirstParse(Dsl.ISyntaxComponent dslInfo) { string id = dslInfo.GetId(); if (id == "command") { StorySystem.CommonCommands.CompositeCommand cmd = new CommonCommands.CompositeCommand(); cmd.InitSharedData(); var first = dslInfo as Dsl.FunctionData; if (null != first) { cmd.Name = first.Call.GetParamId(0); } else { var statement = dslInfo as Dsl.StatementData; if (null != statement) { first = statement.First; cmd.Name = first.Call.GetParamId(0); for (int i = 1; i < statement.GetFunctionNum(); ++i) { var funcData = statement.GetFunction(i); var fid = funcData.GetId(); if (fid == "args") { for (int ix = 0; ix < funcData.Call.GetParamNum(); ++ix) { cmd.ArgNames.Add(funcData.Call.GetParamId(ix)); } } else if (fid == "opts") { for (int ix = 0; ix < funcData.GetStatementNum(); ++ix) { var fcomp = funcData.GetStatement(ix); var fcd = fcomp as Dsl.CallData; if (null != fcd) { cmd.OptArgs.Add(fcd.GetId(), fcd.GetParam(0)); } } } else if (fid == "body") { } else { LogSystem.Error("Command {0} unknown part '{1}'", cmd.Name, fid); } } } } //注册 StoryCommandManager.Instance.RegisterCommandFactory(cmd.Name, new CommonCommands.CompositeCommandFactory(cmd), true); } else if (id == "value") { StorySystem.CommonValues.CompositeValue val = new CommonValues.CompositeValue(); val.InitSharedData(); var first = dslInfo as Dsl.FunctionData; if (null != first) { val.Name = first.Call.GetParamId(0); } else { var statement = dslInfo as Dsl.StatementData; if (null != statement) { first = statement.First; val.Name = first.Call.GetParamId(0); for (int i = 1; i < statement.GetFunctionNum(); ++i) { var funcData = statement.GetFunction(i); var fid = funcData.GetId(); if (fid == "args") { for (int ix = 0; ix < funcData.Call.GetParamNum(); ++ix) { val.ArgNames.Add(funcData.Call.GetParamId(ix)); } } else if (fid == "ret") { val.ReturnName = funcData.Call.GetParamId(0); } else if (fid == "opts") { for (int ix = 0; ix < funcData.GetStatementNum(); ++ix) { var fcomp = funcData.GetStatement(ix); var fcd = fcomp as Dsl.CallData; if (null != fcd) { val.OptArgs.Add(fcd.GetId(), fcd.GetParam(0)); } } } else if (fid == "body") { } else { LogSystem.Error("Value {0} unknown part '{1}'", val.Name, fid); } } } } //注册 StoryValueManager.Instance.RegisterValueFactory(val.Name, new CommonValues.CompositeValueFactory(val), true); } }
public IStoryCommand CreateCommand(Dsl.ISyntaxComponent commandConfig) { IStoryCommand command = null; lock (m_Lock) { Dsl.StatementData statementData = commandConfig as Dsl.StatementData; if (null != statementData) { Dsl.FunctionData func; if (DslSyntaxTransformer.TryTransformCommandLineLikeSyntax(statementData, out func)) { commandConfig = func; } } Dsl.FunctionData callData = commandConfig as Dsl.FunctionData; if (null != callData) { if (callData.IsHighOrder) { Dsl.FunctionData innerCall = callData.LowerOrderFunction; if (innerCall.GetParamClass() == (int)Dsl.FunctionData.ParamClassEnum.PARAM_CLASS_PERIOD || innerCall.GetParamClass() == (int)Dsl.FunctionData.ParamClassEnum.PARAM_CLASS_BRACKET || innerCall.GetParamClass() == (int)Dsl.FunctionData.ParamClassEnum.PARAM_CLASS_PERIOD_BRACE || innerCall.GetParamClass() == (int)Dsl.FunctionData.ParamClassEnum.PARAM_CLASS_PERIOD_BRACKET || innerCall.GetParamClass() == (int)Dsl.FunctionData.ParamClassEnum.PARAM_CLASS_PERIOD_PARENTHESIS) { if (callData.GetParamClass() == (int)Dsl.FunctionData.ParamClassEnum.PARAM_CLASS_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,...) -> execinstance(obj,member,a,b,...) Dsl.FunctionData newCall = new Dsl.FunctionData(); if (innerCall.GetParamClass() == (int)Dsl.FunctionData.ParamClassEnum.PARAM_CLASS_PERIOD) { newCall.Name = new Dsl.ValueData("dotnetexec", Dsl.ValueData.ID_TOKEN); } else { newCall.Name = new Dsl.ValueData("collectionexec", Dsl.ValueData.ID_TOKEN); } newCall.SetParamClass((int)Dsl.FunctionData.ParamClassEnum.PARAM_CLASS_PARENTHESIS); if (innerCall.IsHighOrder) { newCall.Params.Add(innerCall.LowerOrderFunction); newCall.Params.Add(ObjectMemberConverter.Convert(innerCall.GetParam(0), innerCall.GetParamClass())); 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(ObjectMemberConverter.Convert(innerCall.GetParam(0), innerCall.GetParamClass())); for (int i = 0; i < callData.GetParamNum(); ++i) { Dsl.ISyntaxComponent p = callData.Params[i]; newCall.Params.Add(p); } } return(CreateCommand(newCall)); } } } else if (callData.GetId() == "=") { Dsl.FunctionData innerCall = callData.GetParam(0) as Dsl.FunctionData; if (null != innerCall && (innerCall.GetParamClass() == (int)Dsl.FunctionData.ParamClassEnum.PARAM_CLASS_PERIOD || innerCall.GetParamClass() == (int)Dsl.FunctionData.ParamClassEnum.PARAM_CLASS_BRACKET || innerCall.GetParamClass() == (int)Dsl.FunctionData.ParamClassEnum.PARAM_CLASS_PERIOD_BRACE || innerCall.GetParamClass() == (int)Dsl.FunctionData.ParamClassEnum.PARAM_CLASS_PERIOD_BRACKET || innerCall.GetParamClass() == (int)Dsl.FunctionData.ParamClassEnum.PARAM_CLASS_PERIOD_PARENTHESIS)) { //obj.property = val or obj[property] = val or obj.(property) = val or obj.[property] = val or obj.{property} = val -> setinstance(obj,property,val) Dsl.FunctionData newCall = new Dsl.FunctionData(); if (innerCall.GetParamClass() == (int)Dsl.FunctionData.ParamClassEnum.PARAM_CLASS_PERIOD) { newCall.Name = new Dsl.ValueData("dotnetset", Dsl.ValueData.ID_TOKEN); } else { newCall.Name = new Dsl.ValueData("collectionset", Dsl.ValueData.ID_TOKEN); } newCall.SetParamClass((int)Dsl.FunctionData.ParamClassEnum.PARAM_CLASS_PARENTHESIS); if (innerCall.IsHighOrder) { newCall.Params.Add(innerCall.LowerOrderFunction); newCall.Params.Add(ObjectMemberConverter.Convert(innerCall.GetParam(0), innerCall.GetParamClass())); newCall.Params.Add(callData.GetParam(1)); } else { newCall.Params.Add(innerCall.Name); newCall.Params.Add(ObjectMemberConverter.Convert(innerCall.GetParam(0), innerCall.GetParamClass())); newCall.Params.Add(callData.GetParam(1)); } return(CreateCommand(newCall)); } } } string type = commandConfig.GetId(); if (commandConfig.GetIdType() == Dsl.ValueData.ID_TOKEN && type != "true" && type != "false") { IStoryCommandFactory factory = GetFactory(type); if (null != factory) { try { command = factory.Create(); if (!command.Init(commandConfig)) { GameFramework.LogSystem.Error("[LoadStory] command:{0}[{1}] line:{2} failed.", type, commandConfig.ToScriptString(false), commandConfig.GetLine()); } } catch (Exception ex) { var msg = string.Format("[LoadStory] command:{0}[{1}] line:{2} failed.", type, commandConfig.ToScriptString(false), commandConfig.GetLine()); throw new Exception(msg, ex); } } else { #if DEBUG string err = string.Format("[LoadStory] CreateCommand failed, line:{0} command:{1}[{2}]", commandConfig.GetLine(), type, commandConfig.ToScriptString(false)); GameFramework.LogSystem.Error("{0}", err); throw new Exception(err); #else GameFramework.LogSystem.Error("[LoadStory] CreateCommand failed, type:{0} line:{1}", type, commandConfig.GetLine()); #endif } if (null != command) { //GameFramework.LogSystem.Debug("[LoadStory] CreateCommand, type:{0} command:{1}", type, command.GetType().Name); } else { #if DEBUG string err = string.Format("[LoadStory] CreateCommand failed, line:{0} command:{1}[{2}]", commandConfig.GetLine(), type, commandConfig.ToScriptString(false)); GameFramework.LogSystem.Error("{0}", err); throw new Exception(err); #else GameFramework.LogSystem.Error("[LoadStory] CreateCommand failed, type:{0} line:{1}", type, commandConfig.GetLine()); #endif } } } return(command); }
public IStoryCommand CreateCommand(Dsl.ISyntaxComponent commandConfig) { Dsl.CallData callData = commandConfig as Dsl.CallData; if (null != callData) { if (callData.IsHighOrder) { Dsl.CallData innerCall = callData.Call; if (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) { if (callData.GetParamClass() == (int)Dsl.CallData.ParamClassEnum.PARAM_CLASS_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,...) -> execinstance(obj,member,a,b,...) Dsl.CallData newCall = new Dsl.CallData(); newCall.Name = new Dsl.ValueData("dotnetexec", 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(CreateCommand(newCall)); } } } else if ((callData.GetParamClass() == (int)Dsl.CallData.ParamClassEnum.PARAM_CLASS_OPERATOR || 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) && callData.GetId() == "=") { Dsl.CallData innerCall = callData.GetParam(0) as Dsl.CallData; if (null != innerCall) { //obj.property = val or obj[property] = val or obj.(property) = val or obj.[property] = val or obj.{property} = val -> setinstance(obj,property,val) Dsl.CallData newCall = new Dsl.CallData(); newCall.Name = new Dsl.ValueData("dotnetset", 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)); newCall.Params.Add(callData.GetParam(1)); } else { newCall.Params.Add(innerCall.Name); newCall.Params.Add(innerCall.GetParam(0)); newCall.Params.Add(callData.GetParam(1)); } return(CreateCommand(newCall)); } } } IStoryCommand command = null; string type = commandConfig.GetId(); if (commandConfig.GetIdType() == Dsl.ValueData.ID_TOKEN) { IStoryCommandFactory factory = GetFactory(type); if (null != factory) { try { command = factory.Create(); if (!command.Init(commandConfig)) { GameFramework.LogSystem.Error("[LoadStory] command:{0}[{1}] line:{2} failed.", type, commandConfig.ToScriptString(false), commandConfig.GetLine()); } } catch (Exception ex) { GameFramework.LogSystem.Error("[LoadStory] command:{0}[{1}] line:{2} failed.", type, commandConfig.ToScriptString(false), commandConfig.GetLine()); throw ex; } } else { #if DEBUG string err = string.Format("[LoadStory] CreateCommand failed, line:{0} command:{1}[{2}]", commandConfig.GetLine(), type, commandConfig.ToScriptString(false)); GameFramework.LogSystem.Error("{0}", err); throw new Exception(err); #else GameFramework.LogSystem.Error("[LoadStory] CreateCommand failed, type:{0} line:{1}", type, commandConfig.GetLine()); #endif } if (null != command) { //GameFramework.LogSystem.Debug("[LoadStory] CreateCommand, type:{0} command:{1}", type, command.GetType().Name); } else { #if DEBUG string err = string.Format("[LoadStory] CreateCommand failed, line:{0} command:{1}[{2}]", commandConfig.GetLine(), type, commandConfig.ToScriptString(false)); GameFramework.LogSystem.Error("{0}", err); throw new Exception(err); #else GameFramework.LogSystem.Error("[LoadStory] CreateCommand failed, type:{0} line:{1}", type, commandConfig.GetLine()); #endif } } return(command); }
public void Set(Dsl.ISyntaxComponent p) { m_KeyOrValue = p.GetId(); }
public static void Import(string path, string name, ModelImporter importer) { Dsl.DslFile file = new Dsl.DslFile(); if (file.Load(path, (string msg) => { Debug.Log(msg); })) { Dsl.ISyntaxComponent dslInfo = null; Dsl.FunctionData funcData = null; if (file.DslInfos.Count == 1) { dslInfo = file.DslInfos[0]; funcData = dslInfo as Dsl.FunctionData; var stData = dslInfo as Dsl.StatementData; if (null == funcData && null != stData) { funcData = stData.First; } } else { foreach (var info in file.DslInfos) { if (info.GetId() == "model") { funcData = info as Dsl.FunctionData; var stData = info as Dsl.StatementData; if (null == funcData && null != stData) { funcData = stData.First; } if (null != funcData) { var callData = funcData; if (funcData.IsHighOrder) { callData = funcData.LowerOrderFunction; } if (callData.GetParamId(0) == name) { dslInfo = info; break; } } } } } if (null != dslInfo) { if (dslInfo.GetId() == "model") { List <ModelImporterClipAnimation> list = new List <ModelImporterClipAnimation>(); foreach (Dsl.ISyntaxComponent clipInfo in funcData.Params) { var fd = clipInfo as Dsl.FunctionData; if (null != fd) { var cd = fd; if (fd.IsHighOrder) { cd = fd.LowerOrderFunction; } string id = cd.GetId(); if (id == "setting") { foreach (var settingInfo in fd.Params) { var setting = settingInfo as Dsl.FunctionData; if (null != setting) { string key = setting.GetId(); if (key == "import_animation") { importer.importAnimation = bool.Parse(setting.GetParamId(0)); } else if (key == "resample_curves") { importer.resampleCurves = bool.Parse(setting.GetParamId(0)); } else if (key == "animation_compression") { importer.animationCompression = GameFramework.Converter.ConvertStrToEnum <UnityEditor.ModelImporterAnimationCompression>(setting.GetParamId(0)); } else if (key == "rotation_error") { importer.animationRotationError = float.Parse(setting.GetParamId(0)); } else if (key == "position_error") { importer.animationPositionError = float.Parse(setting.GetParamId(0)); } else if (key == "scale_error") { importer.animationScaleError = float.Parse(setting.GetParamId(0)); } } } } else if (id == "clip_animation") { ModelImporterClipAnimation clip = new ModelImporterClipAnimation(); clip.name = cd.GetParamId(0); foreach (var settingInfo in fd.Params) { var setting = settingInfo as Dsl.FunctionData; if (null != setting) { string key = setting.GetId(); if (key == "take_name") { clip.takeName = setting.GetParamId(0); } else if (key == "first_frame") { clip.firstFrame = float.Parse(setting.GetParamId(0)); } else if (key == "last_frame") { clip.lastFrame = float.Parse(setting.GetParamId(0)); } else if (key == "loop_time") { clip.loopTime = bool.Parse(setting.GetParamId(0)); } else if (key == "loop_pose") { clip.loopPose = bool.Parse(setting.GetParamId(0)); } else if (key == "cycle_offset") { clip.cycleOffset = float.Parse(setting.GetParamId(0)); } else if (key == "additive_reference_pose") { clip.hasAdditiveReferencePose = bool.Parse(setting.GetParamId(0)); } else if (key == "additive_reference_pose_frame") { clip.additiveReferencePoseFrame = float.Parse(setting.GetParamId(0)); } } } list.Add(clip); } } } importer.clipAnimations = list.ToArray(); importer.SaveAndReimport(); } } else { EditorUtility.DisplayDialog("提示", "找不到对应名字的数据,如果需要不同名导入,导入数据里只能包含一个model", "ok"); } } }
public static void FinalParse(Dsl.ISyntaxComponent dslInfo) { string id = dslInfo.GetId(); if (id == "command") { string name = string.Empty; var first = dslInfo as Dsl.FunctionData; var statement = dslInfo as Dsl.StatementData; if (null != first) { name = first.Call.GetParamId(0); } else { if (null != statement) { first = statement.First; name = first.Call.GetParamId(0); } } IStoryCommandFactory factory = StoryCommandManager.Instance.FindFactory(name); if (null != factory) { StorySystem.CommonCommands.CompositeCommand cmd = factory.Create() as StorySystem.CommonCommands.CompositeCommand; cmd.InitialCommands.Clear(); Dsl.FunctionData bodyFunc = null; if (null != statement) { for (int i = 0; i < statement.GetFunctionNum(); ++i) { var funcData = statement.GetFunction(i); var fid = funcData.GetId(); if (funcData.HaveStatement() && fid != "opts") { bodyFunc = funcData; } } } else { bodyFunc = first; } if (null != bodyFunc) { for (int ix = 0; ix < bodyFunc.GetStatementNum(); ++ix) { Dsl.ISyntaxComponent syntaxComp = bodyFunc.GetStatement(ix); IStoryCommand sub = StoryCommandManager.Instance.CreateCommand(syntaxComp); cmd.InitialCommands.Add(sub); } } else { LogSystem.Error("Can't find command {0}'s body", name); } } else { LogSystem.Error("Can't find command {0}'s factory", name); } } else if (id == "value") { string name = string.Empty; var first = dslInfo as Dsl.FunctionData; var statement = dslInfo as Dsl.StatementData; if (null != first) { name = first.Call.GetParamId(0); } else { if (null != statement) { first = statement.First; name = first.Call.GetParamId(0); } } IStoryValueFactory factory = StoryValueManager.Instance.FindFactory(name); if (null != factory) { StorySystem.CommonValues.CompositeValue val = factory.Build() as StorySystem.CommonValues.CompositeValue; val.InitialCommands.Clear(); Dsl.FunctionData bodyFunc = null; if (null != statement) { for (int i = 0; i < statement.GetFunctionNum(); ++i) { var funcData = statement.GetFunction(i); var fid = funcData.GetId(); if (funcData.HaveStatement() && fid != "opts") { bodyFunc = funcData; } } } else { bodyFunc = first; } if (null != bodyFunc) { for (int ix = 0; ix < bodyFunc.GetStatementNum(); ++ix) { Dsl.ISyntaxComponent syntaxComp = bodyFunc.GetStatement(ix); IStoryCommand sub = StoryCommandManager.Instance.CreateCommand(syntaxComp); val.InitialCommands.Add(sub); } } else { LogSystem.Error("Can't find value {0}'s body", name); } } else { LogSystem.Error("Can't find value {0}'s factory", name); } } }
internal IExpression Load(Dsl.ISyntaxComponent comp) { Dsl.ValueData valueData = comp as Dsl.ValueData; if (null != valueData) { int idType = valueData.GetIdType(); if (idType == Dsl.ValueData.ID_TOKEN) { NamedVarGet varExp = new NamedVarGet(); varExp.Load(comp, this); return(varExp); } else { ConstGet constExp = new ConstGet(); constExp.Load(comp, this); return(constExp); } } else { Dsl.CallData callData = comp as Dsl.CallData; if (null != callData) { if (!callData.HaveId()) { int num = callData.GetParamNum(); if (num == 1) { Dsl.ISyntaxComponent param = callData.GetParam(0); return(Load(param)); } else { ParenthesisExp exp = new ParenthesisExp(); exp.Load(comp, this); return(exp); } } else { string op = callData.GetId(); if (op == "=") //赋值 { string name = callData.GetParamId(0); IExpression exp = null; if (name == "var") { exp = new VarSet(); } else { exp = new NamedVarSet(); } if (null != exp) { exp.Load(comp, this); } else { //error Console.WriteLine("DslCalculator error, {0} line {1}", callData.ToScriptString(false), callData.GetLine()); } return(exp); } } } } IExpression ret = Create(comp.GetId()); if (null != ret) { if (!ret.Load(comp, this)) { //error Console.WriteLine("DslCalculator error, {0} line {1}", comp.ToScriptString(false), comp.GetLine()); } } else { //error Console.WriteLine("DslCalculator error, {0} line {1}", comp.ToScriptString(false), comp.GetLine()); } return(ret); }