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