Пример #1
0
        public override void Generate(NodeGenerateContext Context)
        {
            var LoopLabel = Context.MethodGenerator.DefineLabel("Loop");
            var ContinueLabel = Context.MethodGenerator.DefineLabel("Continue");
            var BreakLabel = Context.MethodGenerator.DefineLabel("Break");
            Context.PushContinueBreakNode(new ContinueBreakNode()
            {
                ContinueLabel = ContinueLabel,
                BreakLabel = BreakLabel,
            }, () =>
            {
                Context.MethodGenerator.Comment("InitialSentence");
                (InitialSentence.AstNode as Node).Generate(Context);
                Context.MethodGenerator.ClearStack();

                LoopLabel.Mark();
                {
                    Context.MethodGenerator.Comment("ConditionExpresion");
                    (ConditionExpresion.AstNode as Node).Generate(Context);
                    //Context.MethodGenerator.ConvTo<bool>();
                    Context.MethodGenerator.BranchIfFalse(BreakLabel);
                }
                {
                    Context.MethodGenerator.Comment("LoopSentence");
                    (LoopSentence.AstNode as Node).Generate(Context);

                    ContinueLabel.Mark();
                    Context.MethodGenerator.Comment("PostSentence");
                    (PostSentence.AstNode as Node).Generate(Context);
                    Context.MethodGenerator.ClearStack();
                    Context.MethodGenerator.BranchAlways(LoopLabel);
                }
                BreakLabel.Mark();
            });
        }
Пример #2
0
        public override void Generate(NodeGenerateContext Context)
        {
            var IteratorLocal = Context.MethodGenerator.CreateLocal<IEnumerator<KeyValuePair<Php54Var, Php54Var>>>("IteratorLocal");
            var StartLoopLabel = Context.MethodGenerator.DefineLabel("StartLoopLabel");
            var EndLoopLabel = Context.MethodGenerator.DefineLabel("EndtLoopLabel");

            Context.PushContinueBreakNode(new ContinueBreakNode()
            {
                ContinueLabel = StartLoopLabel,
                BreakLabel = EndLoopLabel,
            }, () =>
            {

                (IterableExpressionParseNode.AstNode as Node).Generate(Context);
                Context.MethodGenerator.ConvTo<Php54Var>();
                Context.MethodGenerator.Call((Func<IEnumerator<KeyValuePair<Php54Var, Php54Var>>>)Php54Var.Methods.GetArrayIterator);
                Context.MethodGenerator.StoreToLocal(IteratorLocal);

                StartLoopLabel.Mark();
                {
                    // while (iterator.MoveNext())
                    Context.MethodGenerator.LoadLocal(IteratorLocal);
                    Context.MethodGenerator.Call((Func<IEnumerator<KeyValuePair<Php54Var, Php54Var>>, bool>)Php54Var.IteratorMoveNext);
                    Context.MethodGenerator.BranchIfFalse(EndLoopLabel);

                    if (VariableKeyGetParseNode != null)
                    {
                        // as $key
                        (VariableKeyGetParseNode.AstNode as Node).Generate(Context);
                        Context.MethodGenerator.ConvTo<Php54Var>();
                        // iterator.Current
                        Context.MethodGenerator.LoadLocal(IteratorLocal);
                        Context.MethodGenerator.Call((Func<IEnumerator<KeyValuePair<Php54Var, Php54Var>>, Php54Var>)Php54Var.IteratorGetCurrentKey);
                        Context.MethodGenerator.ConvTo<Php54Var>();
                        // $var = iterator.Current
                        Context.MethodGenerator.Call((Action<Php54Var, Php54Var>)Php54Var.Assign);
                    }

                    // $value
                    (VariableValueGetParseNode.AstNode as Node).Generate(Context);
                    Context.MethodGenerator.ConvTo<Php54Var>();
                    // iterator.Current
                    Context.MethodGenerator.LoadLocal(IteratorLocal);
                    Context.MethodGenerator.Call((Func<IEnumerator<KeyValuePair<Php54Var, Php54Var>>, Php54Var>)Php54Var.IteratorGetCurrentValue);
                    Context.MethodGenerator.ConvTo<Php54Var>();
                    // $var = iterator.Current
                    Context.MethodGenerator.Call((Action<Php54Var, Php54Var>)Php54Var.Assign);

                    // <iteration code>
                    (IterationCodeNode.AstNode as Node).Generate(Context);

                    Context.MethodGenerator.BranchAlways(StartLoopLabel);
                }
                EndLoopLabel.Mark();

                Context.MethodGenerator.ClearStack();
            });
        }
Пример #3
0
        public override void Generate(NodeGenerateContext Context)
        {
            var EndSwitchLabel = Context.MethodGenerator.DefineLabel("EndSwitch");

            Context.PushContinueBreakNode(new ContinueBreakNode() { BreakLabel = EndSwitchLabel }, () =>
            {
                var ExpressionLocal = Context.MethodGenerator.CreateLocal<Php54Var>("SwitchExpression");
                {
                    (Expression.AstNode as Node).GenerateAs<Php54Var>(Context);
                }
                Context.MethodGenerator.StoreToLocal(ExpressionLocal);

                var DefaultLabel = EndSwitchLabel;

                foreach (var Sentence in Sentences)
                {
                    var CurrentNode = (Sentence.AstNode as Node).GetNonIgnoredNode();
                    //Console.WriteLine(CurrentNode);
                    var CaseNode = (CurrentNode as SwitchCaseSentenceNode);
                    if (CaseNode != null)
                    {
                        if (CaseNode.IsDefault)
                        {
                            DefaultLabel = CaseNode.Label;
                        }
                        else
                        {
                            Context.MethodGenerator.LoadLocal(ExpressionLocal);
                            (CaseNode.Value.AstNode as Node).GenerateAs<Php54Var>(Context);
                            Context.MethodGenerator.Call((Func<Php54Var, Php54Var, bool>)Php54Var.CompareEquals);
                            Context.MethodGenerator.BranchIfTrue(CaseNode.Label);
                        }
                    }
                }

                Context.MethodGenerator.BranchAlways(DefaultLabel);

                foreach (var Sentence in Sentences)
                {
                    (Sentence.AstNode as Node).Generate(Context);
                }

                EndSwitchLabel.Mark();
                //base.Generate(Context);
            });
        }
Пример #4
0
        public override void Generate(NodeGenerateContext Context)
        {
            var ContinueLabel = Context.MethodGenerator.DefineLabel("Loop");
            var BreakLabel = Context.MethodGenerator.DefineLabel("End");

            Context.PushContinueBreakNode(new ContinueBreakNode()
            {
                ContinueLabel = ContinueLabel,
                BreakLabel = BreakLabel,
            }, () =>
            {
                ContinueLabel.Mark();
                {
                    (ConditionExpresion.AstNode as Node).Generate(Context);
                    Context.MethodGenerator.ConvTo<bool>();
                    Context.MethodGenerator.BranchIfFalse(BreakLabel);
                }
                {
                    (LoopSentence.AstNode as Node).Generate(Context);
                    Context.MethodGenerator.BranchAlways(ContinueLabel);
                }
                BreakLabel.Mark();
            });
        }