private CompilerContext IfStatement(CompilerContext context) { var ifFalse = Enumerable.Empty <Instruction>(); var expression = context.Node.GetNamedChild("if_condition").GetNamedChild("relational_expression"); context.Compile(expression); var jumpCode = context.JumpExpression; var block = context.Node.GetNamedChild("block"); var child = context.Push(block); CodeStream ifTrue = child.Compiler(child); var elseBlock = context.Node.GetNamedChild("else_block"); if (elseBlock != null) { block = elseBlock.GetNamedChild("block"); child = context.Push(block); ifFalse = child.Compiler(child); ifTrue.AsFluent() .Jmp.I(ifFalse.Count() + 1); } context.Code.AsFluent() .UnaryOp(jumpCode).I(ifTrue.Count() + 1); context.Code += ifTrue; context.Code += ifFalse; return(context); }
public void Movi() { var stream = new CodeStream(); stream.AsFluent() .Mov.RI(Register.A, 0); Assert.That(stream.First(), Is.EqualTo(new Instruction(OpCode.Mov).Destination(Register.A).Source(0)).Using(new InstructionComparer())); }
public void Movr() { var stream = new CodeStream(); stream.AsFluent() .Mov.RR(Register.A, Register.B); var expected = new Instruction(OpCode.Mov).Source(Register.B).Destination(Register.A); Assert.That(stream.First(), Is.EqualTo(expected).Using(new InstructionComparer())); }