protected override bool Load(Dsl.ValueData valData) { if (null != m_Plugin) { return(m_Plugin.LoadValue(valData)); } return(base.Load(valData)); }
//用于同步修改回加载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); } }
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); }
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)); } }
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)); } }
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)); } }
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)); } }
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)); } }
public void InitFromDsl(Dsl.ISyntaxComponent param) { Dsl.ValueData valueData = param as Dsl.ValueData; if (null != valueData) { string id = param.GetId(); int idType = param.GetIdType(); if (idType == Dsl.ValueData.ID_TOKEN && id.StartsWith("$")) { if (0 == id.CompareTo("$$")) { SetArgument(c_Iterator); } else { string idName = id.Substring(1); if (idName.Length > 0 && char.IsDigit(idName[0])) { SetArgument(int.Parse(idName)); } else { SetStack(id); } } } else if (idType == Dsl.ValueData.ID_TOKEN && id.StartsWith("@")) { if (id.StartsWith("@@")) { SetGlobal(id); } else { SetLocal(id); } } else { CalcInitValue(param); } } else { CalcInitValue(param); } }
public 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); }
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); }
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); } }
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; } }
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)); } }
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); } } } }
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); }
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); } }
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); } } }
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)); } } }
protected override bool Load(Dsl.ValueData valData) { m_Variables = Calculator.NamedVariables; m_VarId = valData.GetId(); return(true); }
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); }
protected virtual bool Load(Dsl.ValueData valData) { return(false); }
private static bool DetectVariable(Dsl.ValueData data, Dsl.FunctionData oper, Dsl.ValueData var) { return(CompareVariable(data, var)); }
public bool LoadValue(Dsl.ValueData valData) { var __cs2lua_ret = base.CallFunction(m_Cs2Lua_LoadValue, false, Self, valData); return(base.CastTo <bool>(__cs2lua_ret)); }
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); }
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(); } } } } }
private static bool CompareVariable(Dsl.ValueData data, Dsl.ValueData var) { return(data.GetId() == var.GetId()); }
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); }