Example #1
0
 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);
         }
     }
 }
Example #2
0
        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);
        }
Example #3
0
 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);
        }
Example #5
0
 private object GetMember(CodeMember member)
 {
     if (member.Type != MEMBER_TYPE.VALUE)
     {
         return(this.ResolveOperand(member.MemberObject).KeyValue);
     }
     return(member.MemberValue);
 }
Example #6
0
 public CodeSetMember(CodeMember code)
 {
     CodeSetMemberID    = code.Id;
     CodeSetID          = code.CodeSetId;
     CodeSetMemberValue = code.Code;
     NameEnglish        = code.NameEnglish;
     NameFrench         = code.NameFrench;
     DisplayOrder       = code.DisplayOrder;
 }
Example #7
0
        //返回变量数据
        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);
        }
Example #8
0
        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);
        }
Example #9
0
        //获取一个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);
        }
Example #10
0
        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);
        }
Example #11
0
        //返回变量数据
        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);
        }
Example #12
0
        protected override void Visit(CodeMember expression)
        {
            if (expression.Type != null)
            {
                Visit(expression.Type);
            }

            if (expression.Instance != null)
            {
                Visit(expression.Instance);
            }

            Visit(expression.Member);
        }
Example #13
0
 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);
     }
 }
Example #14
0
 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);
     }
 }
Example #15
0
        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);
        }
Example #16
0
        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));
        }
Example #17
0
 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);
     }
 }
Example #18
0
 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类型");
     }
 }
Example #19
0
 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类型");
     }
 }
Example #20
0
 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);
     }
 }
Example #21
0
 private object GetMember(CodeMember member)
 {
     return(member.Type == MEMBER_TYPE.VALUE ? member.MemberValue : ResolveOperand(member.MemberObject).KeyValue);
 }
Example #22
0
        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);
            }
        }
Example #23
0
        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);
        }
Example #24
0
        //获得单一变量
        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);
        }
Example #25
0
        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);
        }