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; } }