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);
                    }
                }
            }
        }
Beispiel #2
0
        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);
            }
        }
Beispiel #3
0
 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));
         }
     }
 }
Beispiel #6
0
        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;
                    }
                }
            }
        }
Beispiel #7
0
        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);
        }