public IStoryValue CalcValue(Dsl.ISyntaxComponent param) { lock (m_Lock) { Dsl.CallData callData = param as Dsl.CallData; if (null != callData && callData.IsValid() && callData.GetId().Length == 0 && !callData.IsHighOrder && (callData.GetParamClass() == (int)Dsl.CallData.ParamClassEnum.PARAM_CLASS_PARENTHESIS || callData.GetParamClass() == (int)Dsl.CallData.ParamClassEnum.PARAM_CLASS_BRACKET)) { //处理圆括弧与方括弧 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 ret = null; IStoryValueFactory factory = GetFactory("list"); if (null != factory) { try { ret = factory.Build(); ret.InitFromDsl(param); } catch (Exception ex) { GameFramework.LogSystem.Error("[LoadStory] value:{0} line:{1} failed.", param.ToScriptString(false), 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 ret = null; IStoryValueFactory factory = GetFactory("hashtable"); if (null != factory) { try { ret = factory.Build(); ret.InitFromDsl(param); } catch (Exception ex) { GameFramework.LogSystem.Error("[LoadStory] value:{0} line:{1} failed.", param.ToScriptString(false), param.GetLine()); throw ex; } } return(ret); } else { //不支持的语法 return(null); } } else { 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,...) string method = innerCall.GetParamId(0); string apiName; if (method == "orderby" || method == "orderbydesc" || method == "where" || method == "top") { apiName = "linq"; } else { apiName = "dotnetcall"; } Dsl.CallData newCall = new Dsl.CallData(); newCall.Name = new Dsl.ValueData(apiName, 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 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) { GameFramework.LogSystem.Error("[LoadStory] value:{0}[{1}] line:{2} failed.", id, param.ToScriptString(false), param.GetLine()); throw 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 IStoryCommand CreateCommand(Dsl.ISyntaxComponent commandConfig) { lock (m_Lock) { 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.GetId() == "=") { Dsl.CallData innerCall = callData.GetParam(0) as Dsl.CallData; if (null != innerCall) { //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(); IStoryCommandFactory factory = GetFactory(type); if (null != factory) { try { command = factory.Create(); command.Init(commandConfig); } catch (Exception ex) { GameFramework.LogSystem.Error("command:{0} line:{1} failed.", commandConfig.ToScriptString(false), commandConfig.GetLine()); throw ex; } } else { #if DEBUG string err = string.Format("CreateCommand failed, line:{0} command:{1}", commandConfig.GetLine(), commandConfig.ToScriptString(false)); throw new Exception(err); #else GameFramework.LogSystem.Error("CreateCommand failed, type:{0} line:{1}", type, commandConfig.GetLine()); #endif } if (null != command) { GameFramework.LogSystem.Debug("CreateCommand, type:{0} command:{1}", type, command.GetType().Name); } else { #if DEBUG string err = string.Format("CreateCommand failed, line:{0} command:{1}", commandConfig.GetLine(), commandConfig.ToScriptString(false)); throw new Exception(err); #else GameFramework.LogSystem.Error("CreateCommand failed, type:{0} line:{1}", type, commandConfig.GetLine()); #endif } return(command); } }
public void InitFromDsl(Dsl.ISyntaxComponent param) { Dsl.CallData callData = param as Dsl.CallData; if (null != callData && callData.GetId() == "npcidlist") { } }
public bool Init(Dsl.DslInfo config) { if (null == config || null == config.First) { return(false); } bool ret = false; Dsl.FunctionData story = config.First; if (story.GetId() == "story" || story.GetId() == "script") { ret = true; Dsl.CallData callData = story.Call; if (null != callData && callData.HaveParam()) { m_StoryId = callData.GetParamId(0); } for (int i = 0; i < story.Statements.Count; i++) { if (story.Statements[i].GetId() == "local") { Dsl.FunctionData sectionData = story.Statements[i] as Dsl.FunctionData; if (null != sectionData) { for (int j = 0; j < sectionData.Statements.Count; j++) { Dsl.CallData defData = sectionData.Statements[j] as Dsl.CallData; if (null != defData && defData.HaveId() && defData.HaveParam()) { string id = defData.GetId(); if (id.StartsWith("@") && !id.StartsWith("@@")) { StoryValue val = new StoryValue(); val.InitFromDsl(defData.GetParam(0)); if (!m_PreInitedLocalVariables.ContainsKey(id)) { m_PreInitedLocalVariables.Add(id, val.Value); } else { m_PreInitedLocalVariables[id] = val.Value; } } } } } else { #if DEBUG string err = string.Format("Story {0} DSL, local must be a function ! line:{1} local:{2}", m_StoryId, story.Statements[i].GetLine(), story.Statements[i].ToScriptString(false)); throw new Exception(err); #else LogSystem.Error("Story {0} DSL, local must be a function !", m_StoryId); #endif } } else if (story.Statements[i].GetId() == "onmessage" || story.Statements[i].GetId() == "onnamespacedmessage") { StoryMessageHandler handler = null; Dsl.StatementData msgData = story.Statements[i] as Dsl.StatementData; if (null != msgData) { handler = new StoryMessageHandler(); handler.Load(msgData); } else { Dsl.FunctionData sectionData = story.Statements[i] as Dsl.FunctionData; if (null != sectionData) { handler = new StoryMessageHandler(); handler.Load(sectionData); } } if (null != handler) { string msgId; if (!string.IsNullOrEmpty(m_Namespace) && story.Statements[i].GetId() == "onnamespacedmessage") { msgId = string.Format("{0}:{1}", m_Namespace, handler.MessageId); handler.MessageId = msgId; } else { msgId = handler.MessageId; } if (!m_LoadedMessageHandlers.ContainsKey(msgId)) { m_LoadedMessageHandlers.Add(msgId, handler); m_MessageHandlers.Add(handler.Clone()); m_MessageQueues.Add(msgId, new Queue <MessageInfo>()); m_ConcurrentMessageQueues.Add(msgId, new Queue <MessageInfo>()); m_ConcurrentMessageHandlerPool.Add(msgId, new Queue <StoryMessageHandler>()); } else { #if DEBUG string err = string.Format("Story {0} DSL, onmessage or onnamespacedmessage {1} duplicate, discard it ! line:{2}", m_StoryId, msgId, story.Statements[i].GetLine()); throw new Exception(err); #else LogSystem.Error("Story {0} DSL, onmessage {1} duplicate, discard it !", m_StoryId, msgId); #endif } } else { #if DEBUG string err = string.Format("Story {0} DSL, onmessage must be a function or statement ! line:{1} onmessage:{2}", m_StoryId, story.Statements[i].GetLine(), story.Statements[i].ToScriptString(false)); throw new Exception(err); #else LogSystem.Error("Story {0} DSL, onmessage must be a function !", m_StoryId); #endif } } else { #if DEBUG string err = string.Format("StoryInstance::Init, Story {0} unknown part {1}, line:{2} section:{3}", m_StoryId, story.Statements[i].GetId(), story.Statements[i].GetLine(), story.Statements[i].ToScriptString(false)); throw new Exception(err); #else LogSystem.Error("StoryInstance::Init, Story {0} unknown part {1}", m_StoryId, story.Statements[i].GetId()); #endif } } } else { #if DEBUG string err = string.Format("StoryInstance::Init, isn't story DSL, line:{0} story:{1}", story.GetLine(), story.ToScriptString(false)); throw new Exception(err); #else LogSystem.Error("StoryInstance::Init, isn't story DSL"); #endif } LogSystem.Debug("StoryInstance.Init message handler num:{0} {1}", m_MessageHandlers.Count, ret); return(ret); }
internal void Load(Dsl.ISyntaxComponent comp) { Dsl.CallData callData = comp as Dsl.CallData; if (null != callData) { if (!callData.HaveId()) { Dsl.ISyntaxComponent param = callData.GetParam(0); Load(param); } else { string op = callData.GetId(); if (op == "=") //赋值 { Dsl.CallData param1 = callData.GetParam(0) as Dsl.CallData; Dsl.ISyntaxComponent param2 = callData.GetParam(1); string name = param1.GetId(); int id = int.Parse(param1.GetParamId(0)); Load(param2); if (name == "attr") { m_Codes.Add(new Instruction(InsEnum.ATTRSET, id)); } else if (name == "var") { m_Codes.Add(new Instruction(InsEnum.VARSET, id)); } } else if (op == "var") //读属性 { int id = int.Parse(callData.GetParamId(0)); m_Codes.Add(new Instruction(InsEnum.VAR, id)); } else if (op == "attr") //读属性 { int id = int.Parse(callData.GetParamId(0)); m_Codes.Add(new Instruction(InsEnum.ATTR, id)); } else if (op == "attr2") //读属性 { int id = int.Parse(callData.GetParamId(0)); m_Codes.Add(new Instruction(InsEnum.ATTR2, id)); } else if (op == "value") //读常量表 { int id = int.Parse(callData.GetParamId(0)); m_Codes.Add(new Instruction(InsEnum.VALUE, id)); } else if (op == "arg") //读参数值 { int index = int.Parse(callData.GetParamId(0)); m_Codes.Add(new Instruction(InsEnum.ARG, index)); } else if (op == "const") //明确标明的常量值 //普通常量 { long val = long.Parse(callData.GetParamId(0)); m_Codes.Add(new Instruction(InsEnum.CONST, val)); } else //二元及以上运算 { Dsl.ISyntaxComponent param1 = callData.GetParam(0); Dsl.ISyntaxComponent param2 = callData.GetParam(1); Load(param1); Load(param2); if (op == "max") { m_Codes.Add(new Instruction(InsEnum.MAX)); } else if (op == "min") { m_Codes.Add(new Instruction(InsEnum.MIN)); } else if (op == "abs") { m_Codes.Add(new Instruction(InsEnum.ABS)); } else if (op == "+") { m_Codes.Add(new Instruction(InsEnum.ADD)); } else if (op == "-") { m_Codes.Add(new Instruction(InsEnum.SUB)); } else if (op == "*") { m_Codes.Add(new Instruction(InsEnum.MUL)); } else if (op == "/") { m_Codes.Add(new Instruction(InsEnum.DIV)); } else if (op == "%") { m_Codes.Add(new Instruction(InsEnum.MOD)); } else //三元及以上运算 { Dsl.ISyntaxComponent param3 = callData.GetParam(2); Load(param3); if (op == "clamp") { m_Codes.Add(new Instruction(InsEnum.CLAMP)); } } } } } else { Dsl.ValueData valueData = comp as Dsl.ValueData; if (null != valueData && valueData.GetIdType() == Dsl.ValueData.NUM_TOKEN) { //普通常量 long val = long.Parse(valueData.GetId()); m_Codes.Add(new Instruction(InsEnum.CONST, val)); } } }
private static void GenerateConcreteSyntax(Dsl.CallData data, StringBuilder sb, int indent, bool firstLineUseIndent, int paramsStart) { s_CurSyntax = data; string id = string.Empty; var callData = data.Call; if (null == callData) { id = data.GetId(); } if (firstLineUseIndent) { sb.AppendFormat("{0}", GetIndentString(indent)); } if (data.GetParamClass() == (int)Dsl.CallData.ParamClassEnum.PARAM_CLASS_OPERATOR) { int paramNum = data.GetParamNum(); if (paramNum == 1) { var param1 = data.GetParam(0); sb.AppendFormat("({0} ", id); GenerateSyntaxComponent(param1, sb, indent, false, paramsStart); sb.Append(")"); } else if (paramNum == 2) { var param1 = data.GetParam(0); var param2 = data.GetParam(1); bool handled = false; if (id == "=" && param1.GetId() == "multiassign") { var cd = param1 as Dsl.CallData; if (null != cd) { if (cd.GetParamNum() > 1) { string varName = string.Format("__multiassign_{0}", data.GetLine()); sb.AppendFormat("var {0}", varName); sb.AppendFormat(" {0} ", id); GenerateSyntaxComponent(param2, sb, indent, false, paramsStart); sb.Append(";"); int varNum = cd.GetParamNum(); for (int i = 0; i < varNum; ++i) { var parami = cd.GetParam(i); GenerateSyntaxComponent(parami, sb, indent, false, paramsStart); sb.AppendFormat(" = {0}[{1}]", varName, i); if (i < varNum - 1) { sb.Append(";"); } } } else { GenerateSyntaxComponent(cd.GetParam(0), sb, indent, false, paramsStart); sb.AppendFormat(" {0} ", id); GenerateSyntaxComponent(param2, sb, indent, false, paramsStart); } handled = true; } } if (!handled) { if (id != "=") { sb.Append("("); } GenerateSyntaxComponent(param1, sb, indent, false, paramsStart); sb.AppendFormat(" {0} ", id); GenerateSyntaxComponent(param2, sb, indent, false, paramsStart); if (id != "=") { sb.Append(")"); } } } } else if (id == "comment") { sb.AppendFormat("//{0}", data.GetParamId(0)); } else if (id == "local") { sb.Append("var "); string prestr = string.Empty; foreach (var param in data.Params) { sb.Append(prestr); GenerateSyntaxComponent(param, sb, indent, false, paramsStart); prestr = ", "; } } else if (id == "return") { sb.Append("return "); if (data.GetParamNum() > 1) { sb.Append("["); } string prestr = string.Empty; foreach (var param in data.Params) { sb.Append(prestr); GenerateSyntaxComponent(param, sb, indent, false, paramsStart); prestr = ", "; } if (data.GetParamNum() > 1) { sb.Append("]"); } } else if (id == "execunary") { string op = data.GetParamId(0); sb.AppendFormat("{0} ", op); GenerateSyntaxComponent(data.GetParam(1), sb, indent, false, paramsStart); } else if (id == "execbinary") { string op = data.GetParamId(0); GenerateSyntaxComponent(data.GetParam(1), sb, indent, false, paramsStart); sb.AppendFormat(" {0} ", op); GenerateSyntaxComponent(data.GetParam(2), sb, indent, false, paramsStart); } else if (id == "getstatic" || id == "getexternstatic") { var obj = data.Params[1]; var member = data.Params[2]; GenerateSyntaxComponent(obj, sb, indent, false, paramsStart); sb.AppendFormat(".{0}", member.GetId()); } else if (id == "getinstance" || id == "getexterninstance") { var obj = data.Params[1]; var member = data.Params[2]; GenerateSyntaxComponent(obj, sb, indent, false, paramsStart); sb.AppendFormat(".{0}", member.GetId()); } else if (id == "setstatic" || id == "getexternstatic") { var obj = data.Params[1]; var member = data.Params[2]; var val = data.Params[3]; GenerateSyntaxComponent(obj, sb, indent, false, paramsStart); sb.AppendFormat(".{0}", member.GetId()); sb.Append(" = "); GenerateSyntaxComponent(val, sb, indent, false, paramsStart); } else if (id == "setinstance" || id == "getexterninstance") { var obj = data.Params[1]; var member = data.Params[2]; var val = data.Params[3]; GenerateSyntaxComponent(obj, sb, indent, false, paramsStart); sb.AppendFormat(".{0}", member.GetId()); sb.Append(" = "); GenerateSyntaxComponent(val, sb, indent, false, paramsStart); } else if (id == "callstatic" || id == "callexternstatic") { var obj = data.Params[0]; var member = data.Params[1]; GenerateSyntaxComponent(obj, sb, indent, false, paramsStart); sb.AppendFormat(".{0}", member.GetId()); sb.Append("("); string prestr = string.Empty; for (int ix = 2; ix < data.Params.Count; ++ix) { var param = data.Params[ix]; sb.Append(prestr); string paramId = param.GetId(); if (paramId == "...") { sb.AppendFormat("getParams({0})", paramsStart); continue; } GenerateSyntaxComponent(param, sb, indent, false, paramsStart); prestr = ", "; } sb.Append(")"); } else if (id == "callinstance" || id == "callexterninstance") { var obj = data.Params[0]; var member = data.Params[1]; GenerateSyntaxComponent(obj, sb, indent, false, paramsStart); sb.AppendFormat(".{0}", member.GetId()); sb.Append("("); string prestr = string.Empty; for (int ix = 2; ix < data.Params.Count; ++ix) { var param = data.Params[ix]; sb.Append(prestr); string paramId = param.GetId(); if (paramId == "...") { sb.AppendFormat("getParams({0})", paramsStart); continue; } GenerateSyntaxComponent(param, sb, indent, false, paramsStart); prestr = ", "; } sb.Append(")"); } else if (id == "typeargs") { if (data.GetParamNum() > 0) { sb.Append("["); GenerateArguments(data, sb, indent, 0); sb.Append("]"); } else { sb.Append("null"); } } else if (id == "typekinds") { if (data.GetParamNum() > 0) { sb.Append("["); GenerateArguments(data, sb, indent, 0); sb.Append("]"); } else { sb.Append("null"); } } else if (id == "literaldictionary") { sb.Append("{"); string prestr = string.Empty; for (int ix = 2; ix < data.Params.Count; ++ix) { var param = data.Params[ix] as Dsl.CallData; sb.Append(prestr); var k = param.GetParam(0); var v = param.GetParam(1); GenerateSyntaxComponent(k, sb, indent, false, paramsStart); sb.Append(" : "); GenerateSyntaxComponent(v, sb, indent, false, paramsStart); prestr = ", "; } sb.Append("}"); } else if (id == "literallist" || id == "literalcollection" || id == "literalcomplex") { sb.Append("["); string prestr = string.Empty; for (int ix = 2; ix < data.Params.Count; ++ix) { var param = data.Params[ix]; sb.Append(prestr); GenerateSyntaxComponent(param, sb, indent, false, paramsStart); prestr = ", "; } sb.Append("]"); } else if (id == "literalarray") { sb.Append("["); string prestr = string.Empty; for (int ix = 2; ix < data.Params.Count; ++ix) { var param = data.Params[ix]; sb.Append(prestr); GenerateSyntaxComponent(param, sb, indent, false, paramsStart); prestr = ", "; } sb.Append("]"); } else if (id == "newarray") { var typeStr = CalcTypeString(data.GetParam(0)); var typeKind = CalcTypeString(data.GetParam(1)); if (data.GetParamNum() > 2) { var vname = data.GetParamId(2); sb.AppendFormat("wraparray([], {0}, {1}, {2})", vname, typeStr, typeKind); } else { sb.AppendFormat("wraparray([], nil, {0}, {1})", typeStr, typeKind); } } else { if (null != callData) { GenerateSyntaxComponent(callData, sb, indent, false, paramsStart); } else if (id == "elseif") { sb.Append("else if"); } else { sb.Append(id); } if (data.HaveParam()) { switch (data.GetParamClass()) { case (int)Dsl.CallData.ParamClassEnum.PARAM_CLASS_PARENTHESIS: sb.Append("("); break; case (int)Dsl.CallData.ParamClassEnum.PARAM_CLASS_BRACKET: sb.Append("["); break; case (int)Dsl.CallData.ParamClassEnum.PARAM_CLASS_PERIOD: sb.AppendFormat(".{0}", data.GetParamId(0)); break; } if (data.GetParamClass() != (int)Dsl.CallData.ParamClassEnum.PARAM_CLASS_PERIOD) { string prestr = string.Empty; for (int ix = 0; ix < data.Params.Count; ++ix) { var param = data.Params[ix]; sb.Append(prestr); string paramId = param.GetId(); if (paramId == "...") { sb.AppendFormat("getParams({0})", paramsStart); continue; } GenerateSyntaxComponent(param, sb, indent, false, paramsStart); prestr = ", "; } } switch (data.GetParamClass()) { case (int)Dsl.CallData.ParamClassEnum.PARAM_CLASS_PARENTHESIS: sb.Append(")"); break; case (int)Dsl.CallData.ParamClassEnum.PARAM_CLASS_BRACKET: sb.Append("]"); break; case (int)Dsl.CallData.ParamClassEnum.PARAM_CLASS_PERIOD: break; } } } }
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); }