コード例 #1
0
 protected override bool Load(Dsl.ValueData valData)
 {
     if (null != m_Plugin)
     {
         return(m_Plugin.LoadValue(valData));
     }
     return(base.Load(valData));
 }
コード例 #2
0
 //用于同步修改回加载Dsl实例的工具方法
 public static void SetParam(Dsl.CallData callData, int index, string val)
 {
     Dsl.ValueData valData = callData.GetParam(index) as Dsl.ValueData;
     if (null != valData)
     {
         int idType = valData.GetIdType();
         valData.SetId(val);
         valData.SetType(idType);
     }
 }
コード例 #3
0
 private static bool CanSplitPrefixPostfixOperator(Dsl.ISyntaxComponent data, out Dsl.FunctionData oper, out bool prefix)
 {
     oper   = null;
     prefix = false;
     Dsl.ValueData var = null;
     if (DetectPrefixPostfixOperator(data, ref oper, ref var, ref prefix) &&
         !DetectVariable(data, oper, var))
     {
         return(true);
     }
     return(false);
 }
コード例 #4
0
 static public int Clear(IntPtr l)
 {
     try {
         Dsl.ValueData self = (Dsl.ValueData)checkSelf(l);
         self.Clear();
         pushValue(l, true);
         return(1);
     }
     catch (Exception e) {
         return(error(l, e));
     }
 }
コード例 #5
0
 static public int GetLine(IntPtr l)
 {
     try {
         Dsl.ValueData self = (Dsl.ValueData)checkSelf(l);
         var           ret  = self.GetLine();
         pushValue(l, true);
         pushValue(l, ret);
         return(2);
     }
     catch (Exception e) {
         return(error(l, e));
     }
 }
コード例 #6
0
 static public int SetLine(IntPtr l)
 {
     try {
         Dsl.ValueData self = (Dsl.ValueData)checkSelf(l);
         System.Int32  a1;
         checkType(l, 2, out a1);
         self.SetLine(a1);
         pushValue(l, true);
         return(1);
     }
     catch (Exception e) {
         return(error(l, e));
     }
 }
コード例 #7
0
 static public int CopyFrom(IntPtr l)
 {
     try {
         Dsl.ValueData self = (Dsl.ValueData)checkSelf(l);
         Dsl.ValueData a1;
         checkType(l, 2, out a1);
         self.CopyFrom(a1);
         pushValue(l, true);
         return(1);
     }
     catch (Exception e) {
         return(error(l, e));
     }
 }
コード例 #8
0
 static public int ToScriptString(IntPtr l)
 {
     try {
         Dsl.ValueData  self = (Dsl.ValueData)checkSelf(l);
         System.Boolean a1;
         checkType(l, 2, out a1);
         var ret = self.ToScriptString(a1);
         pushValue(l, true);
         pushValue(l, ret);
         return(2);
     }
     catch (Exception e) {
         return(error(l, e));
     }
 }
コード例 #9
0
 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);
     }
 }
コード例 #10
0
 public bool Load(Dsl.ISyntaxComponent dsl, DslCalculator calculator)
 {
     m_Calculator = calculator;
     Dsl.ValueData valueData = dsl as Dsl.ValueData;
     if (null != valueData)
     {
         return(Load(valueData));
     }
     else
     {
         Dsl.CallData callData = dsl as Dsl.CallData;
         if (null != callData)
         {
             bool ret = Load(callData);
             if (!ret)
             {
                 int num = callData.GetParamNum();
                 List <IExpression> args = new List <IExpression>();
                 for (int ix = 0; ix < num; ++ix)
                 {
                     Dsl.ISyntaxComponent param = callData.GetParam(ix);
                     args.Add(calculator.Load(param));
                 }
                 return(Load(args));
             }
             return(ret);
         }
         else
         {
             Dsl.FunctionData funcData = dsl as Dsl.FunctionData;
             if (null != funcData)
             {
                 return(Load(funcData));
             }
             else
             {
                 Dsl.StatementData statementData = dsl as Dsl.StatementData;
                 if (null != statementData)
                 {
                     return(Load(statementData));
                 }
             }
         }
     }
     return(false);
 }
コード例 #11
0
        protected override bool Load(Dsl.ValueData valData)
        {
            string id = valData.GetId();

            if (valData.GetIdType() == Dsl.ValueData.NUM_TOKEN)
            {
                if (id.StartsWith("0x"))
                {
                    m_Val = long.Parse(id.Substring(2), System.Globalization.NumberStyles.HexNumber);
                }
                else
                {
                    m_Val = long.Parse(id);
                }
            }
            else
            {
                m_Val = id;
            }
            return(true);
        }
コード例 #12
0
    public bool LoadValue(Dsl.ValueData valData)
    {
        var err = LuaFunctionHelper.BeginCall(m_Cs2Lua_LoadValue);

        LuaFunctionHelper.PushValue(Self);
        LuaFunctionHelper.PushValue(valData);
        var end_call_res = LuaFunctionHelper.EndCall(err);

        if (end_call_res)
        {
            LuaFunctionHelper.BeginGetResult(err);
            bool __cs2lua_ret;
            LuaFunctionHelper.GetResult(out __cs2lua_ret);
            LuaFunctionHelper.EndGetResult();
            return(__cs2lua_ret);
        }
        else
        {
            return(false);
        }
    }
コード例 #13
0
        private static void GenerateConcreteSyntax(Dsl.ValueData data, StringBuilder sb, int indent, bool firstLineUseIndent, int paramsStart)
        {
            s_CurSyntax = data;
            if (firstLineUseIndent)
            {
                sb.AppendFormat("{0}", GetIndentString(indent));
            }
            string id = data.GetId();

            switch (data.GetIdType())
            {
            case (int)Dsl.ValueData.ID_TOKEN:
            case (int)Dsl.ValueData.NUM_TOKEN:
                sb.Append(id);
                break;

            case (int)Dsl.ValueData.STRING_TOKEN:
                sb.AppendFormat("\"{0}\"", Escape(id));
                break;
            }
        }
コード例 #14
0
 static public int constructor(IntPtr l)
 {
     try {
         int           argc = LuaDLL.lua_gettop(l);
         Dsl.ValueData o;
         if (argc == 1)
         {
             o = new Dsl.ValueData();
             pushValue(l, true);
             pushValue(l, o);
             return(2);
         }
         else if (argc == 2)
         {
             System.String a1;
             checkType(l, 2, out a1);
             o = new Dsl.ValueData(a1);
             pushValue(l, true);
             pushValue(l, o);
             return(2);
         }
         else if (argc == 3)
         {
             System.String a1;
             checkType(l, 2, out a1);
             System.Int32 a2;
             checkType(l, 3, out a2);
             o = new Dsl.ValueData(a1, a2);
             pushValue(l, true);
             pushValue(l, o);
             return(2);
         }
         return(error(l, "New object failed."));
     }
     catch (Exception e) {
         return(error(l, e));
     }
 }
コード例 #15
0
        private static bool DetectVariable(Dsl.ISyntaxComponent data, Dsl.FunctionData oper, Dsl.ValueData var)
        {
            var funcData = data as Dsl.FunctionData;

            if (null != funcData)
            {
                return(DetectVariable(funcData, oper, var));
            }
            else
            {
                var stData = data as Dsl.StatementData;
                if (null != stData)
                {
                    return(DetectVariable(stData, oper, var));
                }
                else
                {
                    var valData = data as Dsl.ValueData;
                    if (null != valData)
                    {
                        return(DetectVariable(valData, oper, var));
                    }
                    else
                    {
                        return(false);
                    }
                }
            }
        }
コード例 #16
0
 private static bool DetectPrefixPostfixOperator(Dsl.StatementData data, ref Dsl.FunctionData oper, ref Dsl.ValueData var, ref bool prefix)
 {
     foreach (var func in data.Functions)
     {
         if (DetectPrefixPostfixOperator(func, ref oper, ref var, ref prefix))
         {
             return(true);
         }
     }
     return(false);
 }
コード例 #17
0
 private static bool DetectPrefixPostfixOperator(Dsl.FunctionData data, ref Dsl.FunctionData oper, ref Dsl.ValueData var, ref bool prefix)
 {
     if (data.IsHighOrder)
     {
         foreach (var p in data.Params)
         {
             if (DetectPrefixPostfixOperator(p, ref oper, ref var, ref prefix))
             {
                 return(true);
             }
         }
         if (DetectPrefixPostfixOperator(data.LowerOrderFunction, ref oper, ref var, ref prefix))
         {
             return(true);
         }
         return(false);
     }
     else
     {
         if (data.GetId() == "prefixoperator")
         {
             var varExp = data.GetParam(1) as Dsl.ValueData;
             if (null != varExp)
             {
                 oper   = data;
                 var    = varExp;
                 prefix = true;
                 return(true);
             }
         }
         else if (data.GetId() == "postfixoperator")
         {
             var varExp = data.GetParam(2) as Dsl.ValueData;
             if (null != varExp)
             {
                 oper   = data;
                 var    = varExp;
                 prefix = false;
                 return(true);
             }
         }
         else
         {
             foreach (var p in data.Params)
             {
                 if (DetectPrefixPostfixOperator(p, ref oper, ref var, ref prefix))
                 {
                     return(true);
                 }
             }
         }
         return(false);
     }
 }
コード例 #18
0
        private static bool DetectPrefixPostfixOperator(Dsl.ISyntaxComponent data, ref Dsl.FunctionData oper, ref Dsl.ValueData var, ref bool prefix)
        {
            var funcData = data as Dsl.FunctionData;

            if (null != funcData)
            {
                return(DetectPrefixPostfixOperator(funcData, ref oper, ref var, ref prefix));
            }
            else
            {
                var stData = data as Dsl.StatementData;
                if (null != stData)
                {
                    return(DetectPrefixPostfixOperator(stData, ref oper, ref var, ref prefix));
                }
                else
                {
                    return(false);
                }
            }
        }
コード例 #19
0
 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));
         }
     }
 }
コード例 #20
0
 protected override bool Load(Dsl.ValueData valData)
 {
     m_Variables = Calculator.NamedVariables;
     m_VarId     = valData.GetId();
     return(true);
 }
コード例 #21
0
 private static bool DetectVariable(Dsl.StatementData data, Dsl.FunctionData oper, Dsl.ValueData var)
 {
     foreach (var func in data.Functions)
     {
         if (DetectVariable(func, oper, var))
         {
             return(true);
         }
     }
     return(false);
 }
コード例 #22
0
 protected virtual bool Load(Dsl.ValueData valData)
 {
     return(false);
 }
コード例 #23
0
 private static bool DetectVariable(Dsl.ValueData data, Dsl.FunctionData oper, Dsl.ValueData var)
 {
     return(CompareVariable(data, var));
 }
コード例 #24
0
    public bool LoadValue(Dsl.ValueData valData)
    {
        var __cs2lua_ret = base.CallFunction(m_Cs2Lua_LoadValue, false, Self, valData);

        return(base.CastTo <bool>(__cs2lua_ret));
    }
コード例 #25
0
 private static bool DetectVariable(Dsl.FunctionData data, Dsl.FunctionData oper, Dsl.ValueData var)
 {
     if (data == oper)
     {
         return(false);
     }
     if (data.HaveParamOrStatement())
     {
         foreach (var p in data.Params)
         {
             if (DetectVariable(p, oper, var))
             {
                 return(true);
             }
         }
     }
     if (data.IsHighOrder)
     {
         return(DetectVariable(data.LowerOrderFunction, oper, var));
     }
     return(false);
 }
コード例 #26
0
        private void CompileSyntaxComponent(Dsl.ISyntaxComponent comp, List <Instruction> codes, StringBuilder err)
        {
            var funcData = comp as Dsl.FunctionData;

            if (null != funcData)
            {
                if (funcData.HaveStatement())
                {
                    foreach (var p in funcData.Params)
                    {
                        CompileSyntaxComponent(p, codes, err);
                    }
                }
                else if (funcData.HaveParam())
                {
                    var callData = funcData;
                    if (!callData.HaveId())
                    {
                        Dsl.ISyntaxComponent param = callData.GetParam(0);
                        CompileSyntaxComponent(param, codes, err);
                    }
                    else
                    {
                        string op = callData.GetId();
                        if (op == "=")  //赋值
                        {
                            Dsl.ValueData param1 = callData.GetParam(0) as Dsl.ValueData;
                            if (null != param1)
                            {
                                Dsl.ISyntaxComponent param2 = callData.GetParam(1);
                                CompileSyntaxComponent(param2, codes, err);
                                if (param1.GetIdType() == Dsl.ValueData.ID_TOKEN)
                                {
                                    string name = param1.GetId();
                                    int    id   = GetVarId(name);
                                    codes.Add(new Instruction(InsEnum.VARSET, id));
                                }
                                else
                                {
                                    err.AppendFormat("operator = illegal, left operand must be a var, code:{0}, line:{1}", callData.ToScriptString(false), callData.GetLine());
                                    err.AppendLine();
                                }
                            }
                            else
                            {
                                err.AppendFormat("operator = illegal, left operand must be a var, code:{0}, line:{1}", callData.ToScriptString(false), callData.GetLine());
                                err.AppendLine();
                            }
                        }
                        else if (op == "arg")  //读参数
                        {
                            int id = int.Parse(callData.GetParamId(0));
                            codes.Add(new Instruction(InsEnum.ARG, id));
                        }
                        else
                        {
                            int num = callData.GetParamNum();
                            for (int i = 0; i < num; ++i)
                            {
                                Dsl.ISyntaxComponent param = callData.GetParam(i);
                                CompileSyntaxComponent(param, codes, err);
                            }
                            if (callData.GetParamClass() == (int)Dsl.FunctionData.ParamClassEnum.PARAM_CLASS_OPERATOR)
                            {
                                if (num == 2 && op != "!" && op != "~" || num == 1 && (op == "+" || op == "-" || op == "!" || op == "~"))
                                {
                                    if (op == "+")
                                    {
                                        if (num == 2)
                                        {
                                            codes.Add(new Instruction(InsEnum.ADD));
                                        }
                                    }
                                    else if (op == "-")
                                    {
                                        if (num == 2)
                                        {
                                            codes.Add(new Instruction(InsEnum.SUB));
                                        }
                                        else
                                        {
                                            codes.Add(new Instruction(InsEnum.NEG));
                                        }
                                    }
                                    else if (op == "*")
                                    {
                                        codes.Add(new Instruction(InsEnum.MUL));
                                    }
                                    else if (op == "/")
                                    {
                                        codes.Add(new Instruction(InsEnum.DIV));
                                    }
                                    else if (op == "%")
                                    {
                                        codes.Add(new Instruction(InsEnum.MOD));
                                    }
                                    else if (op == "&&")
                                    {
                                        codes.Add(new Instruction(InsEnum.AND));
                                    }
                                    else if (op == "||")
                                    {
                                        codes.Add(new Instruction(InsEnum.OR));
                                    }
                                    else if (op == "!")
                                    {
                                        codes.Add(new Instruction(InsEnum.NOT));
                                    }
                                    else if (op == ">")
                                    {
                                        codes.Add(new Instruction(InsEnum.GT));
                                    }
                                    else if (op == ">=")
                                    {
                                        codes.Add(new Instruction(InsEnum.GE));
                                    }
                                    else if (op == "==")
                                    {
                                        codes.Add(new Instruction(InsEnum.EQ));
                                    }
                                    else if (op == "!=")
                                    {
                                        codes.Add(new Instruction(InsEnum.NE));
                                    }
                                    else if (op == "<=")
                                    {
                                        codes.Add(new Instruction(InsEnum.LE));
                                    }
                                    else if (op == "<")
                                    {
                                        codes.Add(new Instruction(InsEnum.LT));
                                    }
                                    else if (op == "<<")
                                    {
                                        codes.Add(new Instruction(InsEnum.LSHIFT));
                                    }
                                    else if (op == ">>")
                                    {
                                        codes.Add(new Instruction(InsEnum.RSHIFT));
                                    }
                                    else if (op == "&")
                                    {
                                        codes.Add(new Instruction(InsEnum.BITAND));
                                    }
                                    else if (op == "|")
                                    {
                                        codes.Add(new Instruction(InsEnum.BITOR));
                                    }
                                    else if (op == "^")
                                    {
                                        codes.Add(new Instruction(InsEnum.BITXOR));
                                    }
                                    else if (op == "~")
                                    {
                                        codes.Add(new Instruction(InsEnum.BITNOT));
                                    }
                                    else
                                    {
                                        err.AppendFormat("operator '{0}' illegal, code:{1}, line:{2}", op, callData.ToScriptString(false), callData.GetLine());
                                        err.AppendLine();
                                    }
                                }
                                else
                                {
                                    err.AppendFormat("operator '{0}' arg num {1} illegal, code:{2}, line:{3}", op, num, callData.ToScriptString(false), callData.GetLine());
                                    err.AppendLine();
                                }
                            }
                            else
                            {
                                int procId = GetApiOrProcId(op);
                                codes.Add(new Instruction(InsEnum.CALL, procId, num));
                            }
                        }
                    }
                }
            }
            else
            {
                Dsl.ValueData valueData = comp as Dsl.ValueData;
                if (null != valueData)
                {
                    if (valueData.GetIdType() == Dsl.ValueData.ID_TOKEN)
                    {
                        //变量
                        string name = valueData.GetId();
                        int    id   = GetVarId(name);
                        codes.Add(new Instruction(InsEnum.VAR, id));
                    }
                    else if (valueData.GetIdType() == Dsl.ValueData.NUM_TOKEN)
                    {
                        //普通常量
                        try {
                            long val = long.Parse(valueData.GetId());
                            codes.Add(new Instruction(InsEnum.PUSH, val));
                        }
                        catch {
                            err.AppendFormat("const must be integer, code:{0}, line:{1}", comp.ToScriptString(false), comp.GetLine());
                            err.AppendLine();
                        }
                    }
                }
            }
        }
コード例 #27
0
 private static bool CompareVariable(Dsl.ValueData data, Dsl.ValueData var)
 {
     return(data.GetId() == var.GetId());
 }
コード例 #28
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);
        }