Exemple #1
0
        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);
        }
Exemple #2
0
        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()));
        }
Exemple #3
0
        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()));
        }
Exemple #4
0
        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()));
        }
Exemple #5
0
        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()));
        }