Пример #1
0
        private void CEBinaryOperator(Parse.BinaryOperator Item, Parse.Block Parent, Block Compiled)
        {
            //Get left element
            CompileElement(Item.lhs, Parent, Compiled);
            //If not pipe then push left and get right element
            if (Item.Type != Parse.BinaryOperator.eType.Pipe)
            {
                //Clear any temps that are left
                Compiled.AddItem(new PushTemporariesCount());
                //Push it to temp
                Compiled.AddItem(new ResultToTemp());

                var first_runnable_execute_index = Compiled.Count;
                //Get right element
                CompileElement(Item.rhs, Parent, Compiled);
                var last_runnable_execute_index = Compiled.Count - 1;

                //Clear any temps that are left
                var ct = new PopClearTemporaries();
                Compiled.AddItem(ct);
                CESetOnJumpFailTo(Compiled, first_runnable_execute_index, last_runnable_execute_index, ct);
            }

            //Apply operator
            switch (Item.Type)
            {
            case Parse.BinaryOperator.eType.Equal:
                Compiled.AddItem(new ResultTextEqualTempText(true, Item.IgnoreCase));
                break;

            case Parse.BinaryOperator.eType.NotEqual:
                Compiled.AddItem(new ResultTextEqualTempText(false, Item.IgnoreCase));
                break;

            case Parse.BinaryOperator.eType.ReferenceEqual:
                Compiled.AddItem(new ResultNodeEqualTempNode(true));
                break;

            case Parse.BinaryOperator.eType.ReferenceNotEqual:
                Compiled.AddItem(new ResultNodeEqualTempNode(false));
                break;

            case Parse.BinaryOperator.eType.ReferenceCopy:
                Compiled.AddItem(new ResultNodeToTempVariable());
                break;

            case Parse.BinaryOperator.eType.TextAppend:
                Compiled.AddItem(new ResultTextAppendToTempText());
                break;

            case Parse.BinaryOperator.eType.TreeAppend:
                Compiled.AddItem(new ResultNodeAppendToTempNode());
                break;

            case Parse.BinaryOperator.eType.TildeAppend:
                Compiled.AddItem(new TempTextAppendToResultNode());
                break;

            case Parse.BinaryOperator.eType.Tilde:
                Compiled.AddItem(new TempTextToResultNode());
                break;

            case Parse.BinaryOperator.eType.Pipe:
                //Save Source
                Compiled.AddItem(new SourceAndSkippedToTemp());
                //Change Source
                Compiled.AddItem(new ResultToSource());

                var first_runnable_execute_index = Compiled.Count;

                //Get right element
                CompileElement(Item.rhs, Parent, Compiled);

                var last_runnable_execute_index = Compiled.Count - 1;

                //Get Source back
                var tts = new TempToSourceAndSkipped();
                Compiled.AddItem(tts);
                //Get Source back if anything fails
                CESetOnJumpFailTo(Compiled, first_runnable_execute_index, last_runnable_execute_index, tts);

                ////Save Source
                //Compiled.AddItem(new NextToSource());
                ////Change source
                //Compiled.AddItem(new ResultToNext());
                ////Get right element
                //CompileElement(Item.rhs, Parent, Compiled);
                ////Get source back
                //Compiled.AddItem(new SourceToNext());
                break;

            default:
                ThrowParseError("Unknown type", Item.Annotation.SourcePosition);
                break;
            }
        }
        private void CEBinaryOperator(Parse.BinaryOperator Item, Parse.Block Parent, Block Compiled)
        {
            //Get left element
            CompileElement(Item.lhs, Parent, Compiled);
            //If not pipe then push left and get right element
            if (Item.Type != Parse.BinaryOperator.eType.Pipe)
            {
                //Clear any temps that are left
                Compiled.AddItem(new PushTemporariesCount());
                //Push it to temp
                Compiled.AddItem(new ResultToTemp());

                var first_runnable_execute_index = Compiled.Count;
                //Get right element
                CompileElement(Item.rhs, Parent, Compiled);
                var last_runnable_execute_index = Compiled.Count - 1;

                //Clear any temps that are left
                var ct = new PopClearTemporaries();
                Compiled.AddItem(ct);
                CESetOnJumpFailTo(Compiled, first_runnable_execute_index, last_runnable_execute_index, ct);
            }

            //Apply operator
            switch (Item.Type)
            {
            case Parse.BinaryOperator.eType.Equal:
                Compiled.AddItem(new ResultTextEqualTempText(true, Item.IgnoreCase));
                break;
            case Parse.BinaryOperator.eType.NotEqual:
                Compiled.AddItem(new ResultTextEqualTempText(false, Item.IgnoreCase));
                break;
            case Parse.BinaryOperator.eType.ReferenceEqual:
                Compiled.AddItem(new ResultNodeEqualTempNode(true));
                break;
            case Parse.BinaryOperator.eType.ReferenceNotEqual:
                Compiled.AddItem(new ResultNodeEqualTempNode(false));
                break;
            case Parse.BinaryOperator.eType.ReferenceCopy:
                Compiled.AddItem(new ResultNodeToTempVariable());
                break;
            case Parse.BinaryOperator.eType.TextAppend:
                Compiled.AddItem(new ResultTextAppendToTempText());
                break;
            case Parse.BinaryOperator.eType.TreeAppend:
                Compiled.AddItem(new ResultNodeAppendToTempNode());
                break;
            case Parse.BinaryOperator.eType.TildeAppend:
                Compiled.AddItem(new TempTextAppendToResultNode());
                break;
            case Parse.BinaryOperator.eType.Tilde:
                Compiled.AddItem(new TempTextToResultNode());
                break;
            case Parse.BinaryOperator.eType.Pipe:
                //Save Source
                Compiled.AddItem(new SourceAndSkippedToTemp());
                //Change Source
                Compiled.AddItem(new ResultToSource());

                var first_runnable_execute_index = Compiled.Count;

                //Get right element
                CompileElement(Item.rhs, Parent, Compiled);

                var last_runnable_execute_index = Compiled.Count - 1;

                //Get Source back
                var tts = new TempToSourceAndSkipped();
                Compiled.AddItem(tts);
                //Get Source back if anything fails
                CESetOnJumpFailTo(Compiled, first_runnable_execute_index, last_runnable_execute_index, tts);

                ////Save Source
                //Compiled.AddItem(new NextToSource());
                ////Change source
                //Compiled.AddItem(new ResultToNext());
                ////Get right element
                //CompileElement(Item.rhs, Parent, Compiled);
                ////Get source back
                //Compiled.AddItem(new SourceToNext());
                break;
            default:
                ThrowParseError("Unknown type", Item.Annotation.SourcePosition);
                break;
            }
        }