Пример #1
0
        private void HandleCall(Call call)
        {
            int index = 1;

            foreach (var p in call.args)
            {
                Setvariable($"%{index++}", p.GetValue());
            }
            OldStacks.Push(CurrentStack);

            BlockStack.Push(CurrentBlock);
            var func = (m_Statements[0] as Block).statements.FirstOrDefault(t => ((t is Func tt) && tt.ident == call.ident)) as Block;

            CurrentBlock    = func;
            CurrentStack    = CurrentBlock.GetStack();
            CurrentStatment = CurrentStack.Pop();
        }
Пример #2
0
        public void Statement()
        {
            if (CurrentBlock == null && CurrentStack == null)
            {
                CurrentBlock    = m_Statements[0] as Block;
                CurrentStack    = CurrentBlock.GetStack();
                CurrentStatment = CurrentStack.Pop();
            }


            if (CurrentStatment is Goto go)
            {
                HandleGoto(go);
            }
            else if (CurrentStatment is Call call)
            {
                HandleCall(call);
            }
            else if (CurrentStatment is Break)
            {
                //pop till we leave a loop TODO

                CurrentBlock    = BlockStack.Pop();
                CurrentStack    = OldStacks.Pop();
                CurrentStatment = CurrentStack.Pop();
            }
            else if (CurrentStatment is Return ret)
            {
                if (ret.expr != null)
                {
                    Setvariable("#result", ret.expr.GetValue());
                }
                //pop till we leave a Func TODO
                CurrentBlock    = BlockStack.Pop();
                CurrentStack    = OldStacks.Pop();
                CurrentStatment = CurrentStack.Pop();
            }
            else if (CurrentStatment is Continue)
            {
                CurrentStack    = CurrentBlock.GetStack();
                CurrentStatment = CurrentStack.Pop();
            }
            else if (CurrentStatment is Block block)
            {
                if (CurrentStatment.Execute())
                {
                    if (block is BaseLoopBlock loop)
                    {
                        CurrentStack.Push(block);
                    }
                    OldStacks.Push(CurrentStack);

                    BlockStack.Push(CurrentBlock);
                    CurrentBlock    = block;
                    CurrentStack    = CurrentBlock.GetStack();
                    CurrentStatment = CurrentStack.Pop();
                    //foreach ( var s in CurrentBlock.statements )
                    //    CurrentStack.Push( s );
                }
                else
                {
                    if (CurrentStack.Count > 0)
                    {
                        CurrentStatment = CurrentStack.Pop();
                    }
                    else
                    {
                        CurrentStatment = null;
                    }
                }
            }
            //DEBUG DONT EXECUTE STATEMENTS
            else if (CurrentStatment != null && CurrentStatment.Execute())
            {
                if (CurrentStack.Count > 0)
                {
                    CurrentStatment = CurrentStack.Pop();
                }
                else
                {
                    CurrentStatment = null;
                }
            }
            //
            if (CurrentStatment == null)
            {
                if (BlockStack.Count > 0)
                {
                    CurrentBlock = BlockStack.Pop();
                    CurrentStack = OldStacks.Pop();
                    if (CurrentStack.Count > 0)
                    {
                        CurrentStatment = CurrentStack.Pop();
                    }
                }
                else
                {
                    CurrentBlock = null;
                    CurrentStack = null;
                }
            }
        }