private void SetVariable(CodeMember member, ScriptObject variable) { if (member.Parent == null) { string name = member.MemberString; if (!SetVariableObject(name, variable)) { m_script.SetObjectInternal(name, variable); } } else { ScriptObject parent = ResolveOperand(member.Parent); if (parent is ScriptArray) { parent.SetValue(GetArrayMember(member), variable); } else if (parent is ScriptTable) { parent.SetValue(GetTableMember(member), variable); } else if (parent is ScriptUserdata) { parent.SetValue(GetUserdataMember(member), variable); } else { throw new ExecutionException("Member Parent 错误的类型:" + parent.Type); } } }
private ScriptObject GetVariable(CodeMember member) { ScriptObject ret = null; if (member.Parent == null) { string name = member.MemberString; ScriptObject obj = GetVariableObject(name); ret = (obj == null ? m_script.GetValue(name) : obj); } else { ret = ResolveOperand(member.Parent).GetValueInternal(GetMember(member)); } if (ret == null) { throw new ExecutionException("GetVariable member is error"); } if (member.Calc != CALC.NONE) { ScriptNumber num = ret as ScriptNumber; if (num == null) { throw new ExecutionException("++或者--只能应用于Number类型"); } return(num.Calc(member.Calc)); } return(ret); }
void ProcessRet() { if (m_scriptInstruction.operand0 == null) { InvokeReturnValue(null); } else { ScriptObject ret = ResolveOperand(m_scriptInstruction.operand0); if (ret is ScriptScriptFunction) { ScriptScriptFunction ssf = ret as ScriptScriptFunction; ssf.isCloure = true; CodeObject co = m_scriptInstruction.operand0; if (co is CodeMember) { CodeMember member = co as CodeMember; if (member.Parent == null) { ssf.SetTable(m_script.GetGlobalTable()); } else { ScriptObject sotable = ResolveOperand(member.Parent); if (sotable is ScriptTable) { ssf.SetTable(sotable as ScriptTable); } } } } InvokeReturnValue(ret); } }
//获取一个Object private CodeObject GetObject() { Stack <TempOperator> operateStack = new Stack <TempOperator>(); Stack <CodeObject> objectStack = new Stack <CodeObject>(); while (true) { objectStack.Push(GetOneObject()); if (!P_Operator(operateStack, objectStack)) { break; } } while (operateStack.Count > 0) { objectStack.Push(new CodeOperator(objectStack.Pop(), objectStack.Pop(), operateStack.Pop().Operator, m_strBreviary, GetSourceLine())); } CodeObject ret = objectStack.Pop(); if (ret is CodeMember) { CodeMember member = ret as CodeMember; if (member.Calc == CALC.NONE) { Token token = ReadToken(); switch (token.Type) { case TokenType.Assign: case TokenType.AssignPlus: case TokenType.AssignMinus: case TokenType.AssignMultiply: case TokenType.AssignDivide: case TokenType.AssignModulo: case TokenType.AssignCombine: case TokenType.AssignInclusiveOr: case TokenType.AssignXOR: case TokenType.AssignShr: case TokenType.AssignShi: ret = new CodeAssign(member, GetObject(), token.Type, m_strBreviary, token.SourceLine); break; default: UndoToken(); break; } } } if (PeekToken().Type == TokenType.QuestionMark) { ReadToken(); CodeTernary ternary = new CodeTernary(); ternary.Allow = ret; ternary.True = GetObject(); ReadColon(); ternary.False = GetObject(); return(ternary); } return(ret); }
private object GetMember(CodeMember member) { if (member.Type != MEMBER_TYPE.VALUE) { return(this.ResolveOperand(member.MemberObject).KeyValue); } return(member.MemberValue); }
public CodeSetMember(CodeMember code) { CodeSetMemberID = code.Id; CodeSetID = code.CodeSetId; CodeSetMemberValue = code.Code; NameEnglish = code.NameEnglish; NameFrench = code.NameFrench; DisplayOrder = code.DisplayOrder; }
//返回变量数据 private CodeObject GetVariable(CodeObject parent) { CodeObject ret = parent; for ( ; ;) { Token m = ReadToken(); if (m.Type == TokenType.Period) { ret = new CodeMember(ReadIdentifier(), ret); } else if (m.Type == TokenType.LeftBracket) { CodeObject member = GetObject(); ReadRightBracket(); if (member is CodeScriptObject) { ScriptObject obj = ((CodeScriptObject)member).Object; if (member.Not) { ret = new CodeMember(!obj.LogicOperation(), ret); } else if (member.Negative) { ScriptNumber num = obj as ScriptNumber; if (num == null) { throw new ParserException("Script Object Type [" + obj.Type + "] is cannot use [-] sign", m); } ret = new CodeMember(num.Negative().KeyValue, ret); } else { ret = new CodeMember(obj.KeyValue, ret); } } else { ret = new CodeMember(member, ret); } } else if (m.Type == TokenType.LeftPar) { UndoToken(); ret = GetFunction(ret); } else { UndoToken(); break; } ret.StackInfo = new StackInfo(m_strBreviary, m.SourceLine); } return(ret); }
private CodeObject GetObject() { Stack <TempOperator> operateStack = new Stack <TempOperator>(); Stack <CodeObject> objectStack = new Stack <CodeObject>(); do { objectStack.Push(this.GetOneObject()); }while (this.P_Operator(operateStack, objectStack)); while (operateStack.Count > 0) { objectStack.Push(new CodeOperator(objectStack.Pop(), objectStack.Pop(), operateStack.Pop().Operator, this.m_strBreviary, this.GetSourceLine())); } CodeObject obj2 = objectStack.Pop(); if (obj2 is CodeMember) { CodeMember member = obj2 as CodeMember; if (member.Calc == CALC.NONE) { Token token = this.ReadToken(); switch (token.Type) { case Scorpio.Compiler.TokenType.AssignShi: case Scorpio.Compiler.TokenType.AssignShr: case Scorpio.Compiler.TokenType.Assign: case Scorpio.Compiler.TokenType.AssignCombine: case Scorpio.Compiler.TokenType.AssignXOR: case Scorpio.Compiler.TokenType.AssignMinus: case Scorpio.Compiler.TokenType.AssignMultiply: case Scorpio.Compiler.TokenType.AssignDivide: case Scorpio.Compiler.TokenType.AssignModulo: case Scorpio.Compiler.TokenType.AssignInclusiveOr: case Scorpio.Compiler.TokenType.AssignPlus: obj2 = new CodeAssign(member, this.GetObject(), token.Type, this.m_strBreviary, token.SourceLine); goto Label_0121; } this.UndoToken(); } } Label_0121: if (this.PeekToken().Type == Scorpio.Compiler.TokenType.QuestionMark) { this.ReadToken(); CodeTernary ternary = new CodeTernary { Allow = obj2, True = this.GetObject() }; this.ReadColon(); ternary.False = this.GetObject(); return(ternary); } return(obj2); }
//获取一个Object private CodeObject GetObject() { Stack <TempOperator> operateStack = new Stack <TempOperator>(); Stack <CodeObject> objectStack = new Stack <CodeObject>(); while (true) { objectStack.Push(GetOneObject()); if (!P_Operator(operateStack, objectStack)) { break; } } while (true) { if (operateStack.Count <= 0) { break; } TempOperator oper = operateStack.Pop(); CodeOperator binexp = new CodeOperator(objectStack.Pop(), objectStack.Pop(), oper.Operator); objectStack.Push(binexp); } CodeObject ret = objectStack.Pop(); if (ret is CodeMember) { CodeMember member = ret as CodeMember; if (member.Calc == CALC.NONE) { Token token = ReadToken(); switch (token.Type) { case TokenType.Assign: case TokenType.AssignPlus: case TokenType.AssignMinus: case TokenType.AssignMultiply: case TokenType.AssignDivide: case TokenType.AssignModulo: case TokenType.AssignCombine: case TokenType.AssignInclusiveOr: case TokenType.AssignXOR: case TokenType.AssignShr: case TokenType.AssignShi: return(new CodeAssign(member, GetObject(), token.Type, m_strBreviary, token.SourceLine)); default: UndoToken(); break; } } } return(ret); }
private ScriptObject GetVariable(CodeMember member) { ScriptObject ret = null; if (member.Parent == null) { string name = (string)member.MemberValue; ScriptObject obj = GetVariableObject(name); ret = (obj == null ? m_script.GetValue(name) : obj); ret.Name = name; } else { ScriptObject parent = ResolveOperand(member.Parent); /*此处设置一下堆栈位置 否则 函数返回值取值出错会报错位置 例如 * function Get() { * return null * } * Get().a * * 上述代码报错会报道 return null 那一行 但实际出错 是 .a 的时候 下面这句话就是把堆栈设置回 .a 那一行 */ m_script.SetStackInfo(member.StackInfo); if (member.Type == MEMBER_TYPE.VALUE) { object name = member.MemberValue; ret = parent.GetValue(name); ret.Name = parent.Name + "." + name.ToString(); } else { object name = ResolveOperand(member.MemberObject).KeyValue; ret = parent.GetValue(name); ret.Name = parent.Name + "." + name.ToString(); } } if (ret == null) { throw new ExecutionException(m_script, "GetVariable member is error"); } if (member.Calc != CALC.NONE) { ScriptNumber num = ret as ScriptNumber; if (num == null) { throw new ExecutionException(m_script, "++或者--只能应用于Number类型"); } return(num.Calc(member.Calc)); } return(ret); }
//返回变量数据 private CodeObject GetVariable(CodeObject parent) { CodeObject ret = parent; for ( ; ;) { Token m = ReadToken(); if (m.Type == TokenType.Period) { string identifier = ReadIdentifier(); ret = new CodeMember(identifier, ret); } else if (m.Type == TokenType.LeftBracket) { CodeObject member = GetObject(); ReadRightBracket(); if (member is CodeScriptObject) { ScriptObject obj = ((CodeScriptObject)member).Object; if (obj is ScriptNumber) { ret = new CodeMember((ScriptNumber)obj, ret); } else if (obj is ScriptString) { ret = new CodeMember(((ScriptString)obj).Value, ret); } else { throw new ParserException("获取变量只能是 number或string", m); } } else { ret = new CodeMember(member, ret); } } else if (m.Type == TokenType.LeftPar) { UndoToken(); ret = GetFunction(ret); } else { UndoToken(); break; } } return(ret); }
protected override void Visit(CodeMember expression) { if (expression.Type != null) { Visit(expression.Type); } if (expression.Instance != null) { Visit(expression.Instance); } Visit(expression.Member); }
private void SetVariable(CodeMember member, ScriptObject variable) { if (member.Parent == null) { string name = (string)member.MemberValue; if (!SetVariableObject(name, variable)) { m_script.SetObjectInternal(name, variable); } } else { ResolveOperand(member.Parent).SetValue(GetMember(member), variable); } }
private void SetVariable(CodeMember member, ScriptObject variable) { if (member.Parent == null) { string memberValue = (string)member.MemberValue; if (!this.SetVariableObject(memberValue, variable)) { this.m_script.SetObjectInternal(memberValue, variable); } } else { this.ResolveOperand(member.Parent).SetValue(this.GetMember(member), variable); } }
private ScriptObject GetVariable(CodeMember member) { ScriptObject ret = null; if (member.Parent == null) { string name = member.MemberString; ScriptObject obj = GetVariableObject(name); ret = (obj == null ? m_script.GetValue(name) : obj); } else { ScriptObject parent = ResolveOperand(member.Parent); if (parent is ScriptArray) { ret = parent.GetValue(GetArrayMember(member)); } else if (parent is ScriptTable) { ret = parent.GetValue(GetTableMember(member)); } else if (parent is ScriptUserdata) { ret = parent.GetValue(GetUserdataMember(member)); } else { throw new ExecutionException("Member Parent 错误的类型:" + parent.Type); } } if (ret == null) { throw new ExecutionException("GetVariable member is error"); } if (member.Calc != CALC.NONE) { ScriptNumber num = ret as ScriptNumber; if (num == null) { throw new ExecutionException("++或者--只能应用于Number类型"); } return(num.Calc(member.Calc)); } return(ret); }
private ScriptObject GetVariable(CodeMember member) { ScriptObject obj2 = null; if (member.Parent == null) { string memberValue = (string)member.MemberValue; ScriptObject variableObject = this.GetVariableObject(memberValue); obj2 = (variableObject == null) ? this.m_script.GetValue(memberValue) : variableObject; obj2.Name = memberValue; } else { ScriptObject obj4 = this.ResolveOperand(member.Parent); this.m_script.SetStackInfo(member.StackInfo); if (member.Type == MEMBER_TYPE.VALUE) { object key = member.MemberValue; obj2 = obj4.GetValue(key); obj2.Name = obj4.Name + "." + key.ToString(); } else { object keyValue = this.ResolveOperand(member.MemberObject).KeyValue; obj2 = obj4.GetValue(keyValue); obj2.Name = obj4.Name + "." + keyValue.ToString(); } } if (obj2 == null) { throw new ExecutionException(this.m_script, "GetVariable member is error"); } if (member.Calc == CALC.NONE) { return(obj2); } ScriptNumber number = obj2 as ScriptNumber; if (number == null) { throw new ExecutionException(this.m_script, "++或者--只能应用于Number类型"); } return(number.Calc(member.Calc)); }
private object GetMember(CodeMember member) { if (member.Type == MEMBER_TYPE.STRING) { return(member.MemberString); } else if (member.Type == MEMBER_TYPE.INDEX) { return(member.MemberIndex); } else if (member.Type == MEMBER_TYPE.NUMBER) { return(member.MemberNumber); } else { return(ResolveOperand(member.MemberObject).ObjectValue); } }
private int GetArrayMember(CodeMember member) { if (member.Type == MEMBER_TYPE.NUMBER) { return(member.MemberNumber); } else if (member.Type == MEMBER_TYPE.OBJECT) { ScriptObject mem = ResolveOperand(member.Member); if (!(mem is ScriptNumber)) { throw new ExecutionException("Array Element 错误的类型:" + mem.Type); } return(((ScriptNumber)mem).ToInt32()); } else { throw new ExecutionException("Array Element 不接受string类型"); } }
private string GetUserdataMember(CodeMember member) { if (member.Type == MEMBER_TYPE.STRING) { return(member.MemberString); } else if (member.Type == MEMBER_TYPE.OBJECT) { ScriptObject mem = ResolveOperand(member.Member); if (!(mem is ScriptString)) { throw new ExecutionException("Userdata Element 错误的类型:" + mem.Type); } return(((ScriptString)mem).Value); } else { throw new ExecutionException("Userdata Element 不接受number类型"); } }
private object GetTableMember(CodeMember member) { if (member.Type == MEMBER_TYPE.NUMBER) { return(member.MemberNumberObject); } else if (member.Type == MEMBER_TYPE.STRING) { return(member.MemberString); } else { ScriptObject mem = ResolveOperand(member.Member); if (!(mem is ScriptString || mem is ScriptNumber)) { throw new ExecutionException("Table Element 错误的类型:" + mem.Type); } return(mem.ObjectValue); } }
private object GetMember(CodeMember member) { return(member.Type == MEMBER_TYPE.VALUE ? member.MemberValue : ResolveOperand(member.MemberObject).KeyValue); }
private CodeObject GetVariable(CodeObject parent) { CodeObject function = parent; while (true) { Token token = this.ReadToken(); if (token.Type == Scorpio.Compiler.TokenType.Period) { function = new CodeMember(this.ReadIdentifier(), function); } else if (token.Type == Scorpio.Compiler.TokenType.LeftBracket) { CodeObject member = this.GetObject(); this.ReadRightBracket(); if (member is CodeScriptObject) { ScriptObject obj4 = ((CodeScriptObject)member).Object; if (member.Not) { function = new CodeMember(!obj4.LogicOperation(), function); } else if (member.Minus) { ScriptNumber number = obj4 as ScriptNumber; if (number == null) { throw new ParserException("Script Object Type [" + obj4.Type + "] is cannot use [-] sign", token); } function = new CodeMember(number.Minus().KeyValue, function); } else if (member.Negative) { ScriptNumber number2 = obj4 as ScriptNumber; if (number2 == null) { throw new ParserException("Script Object Type [" + obj4.Type + "] is cannot use [~] sign", token); } function = new CodeMember(number2.Negative().KeyValue, function); } else { function = new CodeMember(obj4.KeyValue, function); } } else { function = new CodeMember(member, function); } } else if (token.Type == Scorpio.Compiler.TokenType.LeftPar) { this.UndoToken(); function = this.GetFunction(function); } else { this.UndoToken(); return(function); } function.StackInfo = new StackInfo(this.m_strBreviary, token.SourceLine); } }
private CodeObject GetOneObject() { CodeObject parent = null; Token token = this.ReadToken(); bool flag = false; bool flag2 = false; bool flag3 = false; CALC nONE = CALC.NONE; while (true) { if (token.Type == Scorpio.Compiler.TokenType.Not) { flag = true; } else if (token.Type == Scorpio.Compiler.TokenType.Minus) { flag2 = true; } else { if (token.Type != Scorpio.Compiler.TokenType.Negative) { break; } flag3 = true; } token = this.ReadToken(); } if (token.Type == Scorpio.Compiler.TokenType.Increment) { nONE = CALC.PRE_INCREMENT; token = this.ReadToken(); } else if (token.Type == Scorpio.Compiler.TokenType.Decrement) { nONE = CALC.PRE_DECREMENT; token = this.ReadToken(); } switch (token.Type) { case Scorpio.Compiler.TokenType.LeftBrace: this.UndoToken(); parent = this.GetTable(); break; case Scorpio.Compiler.TokenType.LeftPar: parent = new CodeRegion(this.GetObject()); this.ReadRightParenthesis(); break; case Scorpio.Compiler.TokenType.LeftBracket: this.UndoToken(); parent = this.GetArray(); break; case Scorpio.Compiler.TokenType.Function: this.UndoToken(); parent = new CodeFunction(this.ParseFunctionDeclaration(false)); break; case Scorpio.Compiler.TokenType.Boolean: case Scorpio.Compiler.TokenType.Number: case Scorpio.Compiler.TokenType.String: case Scorpio.Compiler.TokenType.SimpleString: parent = new CodeScriptObject(this.m_script, token.Lexeme); break; case Scorpio.Compiler.TokenType.Null: parent = new CodeScriptObject(this.m_script, null); break; case Scorpio.Compiler.TokenType.Eval: parent = this.GetEval(); break; case Scorpio.Compiler.TokenType.Identifier: parent = new CodeMember((string)token.Lexeme); break; default: throw new ParserException("Object起始关键字错误 ", token); } parent.StackInfo = new StackInfo(this.m_strBreviary, token.SourceLine); parent = this.GetVariable(parent); parent.Not = flag; parent.Minus = flag2; parent.Negative = flag3; if (parent is CodeMember) { if (nONE != CALC.NONE) { ((CodeMember)parent).Calc = nONE; return(parent); } Token token2 = this.ReadToken(); if (token2.Type == Scorpio.Compiler.TokenType.Increment) { nONE = CALC.POST_INCREMENT; } else if (token2.Type == Scorpio.Compiler.TokenType.Decrement) { nONE = CALC.POST_DECREMENT; } else { this.UndoToken(); } if (nONE != CALC.NONE) { ((CodeMember)parent).Calc = nONE; } return(parent); } if (nONE != CALC.NONE) { throw new ParserException("++ 或者 -- 只支持变量的操作", token); } return(parent); }
//获得单一变量 private CodeObject GetOneObject() { CodeObject ret = null; Token token = ReadToken(); bool not = false; bool minus = false; bool negative = false; CALC calc = CALC.NONE; while (true) { if (token.Type == TokenType.Not) { not = true; } else if (token.Type == TokenType.Minus) { minus = true; } else if (token.Type == TokenType.Negative) { negative = true; } else { break; } token = ReadToken(); } if (token.Type == TokenType.Increment) { calc = CALC.PRE_INCREMENT; token = ReadToken(); } else if (token.Type == TokenType.Decrement) { calc = CALC.PRE_DECREMENT; token = ReadToken(); } switch (token.Type) { case TokenType.Identifier: ret = new CodeMember((string)token.Lexeme); break; case TokenType.Function: UndoToken(); ret = new CodeFunction(ParseFunctionDeclaration(false)); break; case TokenType.LeftPar: ret = new CodeRegion(GetObject()); ReadRightParenthesis(); break; case TokenType.LeftBracket: UndoToken(); ret = GetArray(); break; case TokenType.LeftBrace: UndoToken(); ret = GetTable(); break; case TokenType.Eval: ret = GetEval(); break; case TokenType.Null: ret = new CodeScriptObject(m_script, null); break; case TokenType.Boolean: case TokenType.Number: case TokenType.String: case TokenType.SimpleString: ret = new CodeScriptObject(m_script, token.Lexeme); break; default: throw new ParserException("Object起始关键字错误 ", token); } ret.StackInfo = new StackInfo(m_strBreviary, token.SourceLine); ret = GetVariable(ret); ret.Not = not; ret.Minus = minus; ret.Negative = negative; if (ret is CodeMember) { if (calc != CALC.NONE) { ((CodeMember)ret).Calc = calc; } else { Token peek = ReadToken(); if (peek.Type == TokenType.Increment) { calc = CALC.POST_INCREMENT; } else if (peek.Type == TokenType.Decrement) { calc = CALC.POST_DECREMENT; } else { UndoToken(); } if (calc != CALC.NONE) { ((CodeMember)ret).Calc = calc; } } } else if (calc != CALC.NONE) { throw new ParserException("++ 或者 -- 只支持变量的操作", token); } return(ret); }
ScriptObject ParseCall(CodeCallFunction scriptFunction, bool needRet) { ScriptObject obj = ResolveOperand(scriptFunction.Member); // 安装function this 信息 if (obj is ScriptScriptFunction) { ScriptScriptFunction suf = obj as ScriptScriptFunction; if (!suf.isCloure) { if (scriptFunction.Member is CodeMember) { CodeMember member = scriptFunction.Member as CodeMember; if (member.Parent == null) { suf.SetTable(m_script.GetGlobalTable()); } else { ScriptObject sotable = ResolveOperand(member.Parent); if (sotable is ScriptTable) { suf.SetTable(sotable as ScriptTable); } } } } } int num = scriptFunction.ParametersCount; ScriptObject[] parameters = new ScriptObject[num]; for (int i = 0; i < num; ++i) { //此处要调用Assign 如果传入number string等基础类型 在函数内自运算的话 会影响 传入的值 parameters[i] = ResolveOperand(scriptFunction.Parameters[i]).Assign(); // 创建闭包 if (parameters[i] is ScriptScriptFunction) { ScriptScriptFunction ssf = parameters[i] as ScriptScriptFunction; ssf.isCloure = true; if (scriptFunction.Parameters[i] is CodeMember) { CodeMember member = scriptFunction.Parameters[i] as CodeMember; if (member.Parent == null) { ssf.SetTable(m_script.GetGlobalTable()); } else { ScriptObject sotable = ResolveOperand(member.Parent); if (sotable is ScriptTable) { ssf.SetTable(sotable as ScriptTable); } } } else if (scriptFunction.Parameters[i] is CodeFunction) { if (obj is ScriptScriptFunction) { ScriptScriptFunction suf = obj as ScriptScriptFunction; ssf.SetTable((ScriptTable)suf.GetValue("this")); } } } } m_script.PushStackInfo(); object ret = obj.Call(parameters); m_script.PopStackInfo(); return(needRet ? m_script.CreateObject(ret) : null); }