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