Пример #1
0
        public void AddNativeProperty(string propertyDesc, ScriptCallbackCB callbackCB, object userData)
        {
            var oldLex = currentLexer;

            currentLexer = new ScriptLex(propertyDesc);

            var baseVar = Root;

            var propName = currentLexer.TokenString;

            currentLexer.Match(ScriptLex.LexTypes.Id);

            while (currentLexer.TokenType == (ScriptLex.LexTypes) '.')
            {
                currentLexer.Match((ScriptLex.LexTypes) '.');

                var link = baseVar.FindChild(propName);
                if (link == null)
                {
                    link = baseVar.AddChild(propName, new ScriptVar(null, ScriptVar.Flags.Object));
                }
                baseVar  = link.Var;
                propName = currentLexer.TokenString;
                currentLexer.Match(ScriptLex.LexTypes.Id);
            }
            var propVar = new ScriptVar();

            callbackCB.Invoke(propVar, null);

            currentLexer = oldLex;

            baseVar.AddChild(propName, propVar);
        }
Пример #2
0
        private ScriptVarLink ParseDefinition(ScriptLex.LexTypes lexType)
        {
            currentLexer.Match(lexType);
            var funcName = string.Empty;

            //named function
            if (currentLexer.TokenType == ScriptLex.LexTypes.Id)
            {
                funcName = currentLexer.TokenString;
                currentLexer.Match(ScriptLex.LexTypes.Id);
            }

            var funcVar = new ScriptVarLink(new ScriptVar(null, ScriptVar.Flags.Function), funcName);

            if (lexType == ScriptLex.LexTypes.RFunction || lexType == ScriptLex.LexTypes.RCatch)
            {
                ParseFunctionArguments(funcVar.Var);
            }

            var funcBegin = currentLexer.TokenStart;
            var noExecute = false;

            Block(ref noExecute);
            funcVar.Var.SetData(currentLexer.GetSubString(funcBegin));

            return(funcVar);
        }
Пример #3
0
        public ScriptVarLink EvalComplex(String code)
        {
            ScriptLex         oldLex    = _currentLexer;
            Stack <ScriptVar> oldScopes = _scopes;

            _currentLexer = new ScriptLex(code);

            _callStack.Clear();
            _scopes.Clear();
            _scopes.Push(Root);

            ScriptVarLink v = null;

            try
            {
                bool execute = true;
                do
                {
                    v = Base(ref execute);
                    if (_currentLexer.TokenType != ScriptLex.LexTypes.Eof)
                    {
                        _currentLexer.Match((ScriptLex.LexTypes) ';');
                    }
                } while (_currentLexer.TokenType != ScriptLex.LexTypes.Eof);
            }
            catch (ScriptException ex)
            {
                String errorMessage = ex.Message;
                int    i            = 0;
                foreach (ScriptVar scriptVar in _scopes)
                {
                    errorMessage += "\n" + i++ + ": " + scriptVar;
                }

#if WINDOWS_UWP
                Debug.WriteLine(errorMessage);
#else
                Console.Write(errorMessage);
#endif
            }

            _currentLexer = oldLex;
            _scopes       = oldScopes;

            if (v != null)
            {
                return(v);
            }

            return(new ScriptVarLink(new ScriptVar(null), null));
        }
Пример #4
0
        public void AddMethod(String funcProto, ScriptCallbackCB callback, Object userdata)
        {
            ScriptLex oldLex = _currentLexer;

            using (_currentLexer = new ScriptLex(funcProto))
            {
                ScriptVar baseVar = Root;

                _currentLexer.Match(ScriptLex.LexTypes.RFunction);
                String funcName = _currentLexer.TokenString;
                _currentLexer.Match(ScriptLex.LexTypes.Id);

                while (_currentLexer.TokenType == (ScriptLex.LexTypes) '.')
                {
                    _currentLexer.Match((ScriptLex.LexTypes) '.');
                    ScriptVarLink link = baseVar.FindChild(funcName);

                    if (link == null)
                    {
                        link = baseVar.AddChild(funcName, new ScriptVar(null, ScriptVar.Flags.Object));
                    }

                    baseVar  = link.Var;
                    funcName = _currentLexer.TokenString;
                    _currentLexer.Match(ScriptLex.LexTypes.Id);
                }

                ScriptVar funcVar = new ScriptVar(null, ScriptVar.Flags.Function | ScriptVar.Flags.Native);
                funcVar.SetCallback(callback, userdata);

                ParseFunctionArguments(funcVar);

                baseVar.AddChild(funcName, funcVar);
            }

            _currentLexer = oldLex;
        }
Пример #5
0
        public ScriptVarLink EvalComplex(string code)
        {
            var oldLex    = currentLexer;
            var oldScopes = scopes;

            currentLexer = new ScriptLex(code);
            scopes       = new List <ScriptVar>();
            //callStack.Clear();
            scopes.Clear();
            scopes.PushBack(Root);

            ScriptVarLink v = null;

            try
            {
                var execute = true;
                do
                {
                    v = Base(ref execute);
                    if (currentLexer.TokenType != ScriptLex.LexTypes.Eof)
                    {
                        currentLexer.Match((ScriptLex.LexTypes) ';');
                    }
                } while (currentLexer.TokenType != ScriptLex.LexTypes.Eof);
            }
            catch (ScriptException ex)
            {
                var errorMessage = new StringBuilder(string.Format("ERROR on line {0} column {1} [{2}]", currentLexer.LineNumber, currentLexer.ColumnNumber, ex.Message));

                int i = 0;
                foreach (ScriptVar scriptVar in scopes)
                {
                    errorMessage.AppendLine();
                    errorMessage.Append(i++ + ": " + scriptVar);
                }

                Console.Error.WriteLine(errorMessage.ToString());
            }

            currentLexer = oldLex;
            scopes       = oldScopes;

            if (v != null)
            {
                return(v);
            }

            return(new ScriptVarLink(new ScriptVar(null), null));
        }
Пример #6
0
        public void AddNative(string funcDesc, ScriptCallbackCB callbackCB, object userData)
        {
            var oldLex = currentLexer;

            currentLexer = new ScriptLex(funcDesc);

            var baseVar = Root;

            currentLexer.Match(ScriptLex.LexTypes.RFunction);
            var funcName = currentLexer.TokenString;

            currentLexer.Match(ScriptLex.LexTypes.Id);

            while (currentLexer.TokenType == (ScriptLex.LexTypes) '.')
            {
                currentLexer.Match((ScriptLex.LexTypes) '.');

                var link = baseVar.FindChild(funcName);
                if (link == null)
                {
                    link = baseVar.AddChild(funcName, new ScriptVar(null, ScriptVar.Flags.Object));
                }
                baseVar  = link.Var;
                funcName = currentLexer.TokenString;
                currentLexer.Match(ScriptLex.LexTypes.Id);
            }

            var funcVar = new ScriptVar(null, ScriptVar.Flags.Function | ScriptVar.Flags.Native);

            funcVar.SetCallback(callbackCB, userData);
            ParseFunctionArguments(funcVar);

            currentLexer = oldLex;

            baseVar.AddChild(funcName, funcVar);
        }
Пример #7
0
        private ScriptVarLink ParseFunctionDefinition()
        {
            _currentLexer.Match(ScriptLex.LexTypes.RFunction);
            String funcName = String.Empty;

            //named function
            if (_currentLexer.TokenType == ScriptLex.LexTypes.Id)
            {
                funcName = _currentLexer.TokenString;
                _currentLexer.Match(ScriptLex.LexTypes.Id);
            }

            ScriptVarLink funcVar = new ScriptVarLink(new ScriptVar(null, ScriptVar.Flags.Function), funcName);

            ParseFunctionArguments(funcVar.Var);

            Int32 funcBegin = _currentLexer.TokenStart;
            bool  execute   = false;

            Block(ref execute);
            funcVar.Var.SetData(_currentLexer.GetSubString(funcBegin));

            return(funcVar);
        }