public void Visit(IfThenElse ifthenelse)
        {
            var elseLabel      = MakeNewLabel();
            var endLabel       = MakeNewLabel();
            var resultVariable = MakeNewTemp();

            ifthenelse.IfExpr.Accept(this);
            var ifoperand = tacs.Last().Result;

            tacs.Add(Tac.IfFalse(ifoperand, elseLabel));
            ifthenelse.ThenExpr.Accept(this);
            tacs.Add(Tac.Assign(tacs.Last().Result, resultVariable));
            tacs.Add(Tac.Goto(endLabel));
            tacs.Add(Tac.Label(elseLabel, resultVariable));
            ifthenelse.ElseExpr.Accept(this);
            tacs.Add(Tac.Assign(tacs.Last().Result, resultVariable));
            tacs.Add(Tac.Label(endLabel, resultVariable));
        }
        public void Visit(AndOperator and)
        {
            var falseLabel = MakeNewLabel();
            var endLabel   = MakeNewLabel();

            and.Left.Accept(this);
            var leftOperand = tacs.Last().Result;

            tacs.Add(Tac.IfFalse(leftOperand, falseLabel));
            and.Right.Accept(this);
            var rightOperand = tacs.Last().Result;

            tacs.Add(Tac.IfFalse(rightOperand, falseLabel));
            var resultVariable = MakeNewTemp();

            tacs.Add(Tac.Assign("1", resultVariable));
            tacs.Add(Tac.Goto(endLabel));
            tacs.Add(Tac.Label(falseLabel, resultVariable));
            tacs.Add(Tac.Assign("0", resultVariable));
            tacs.Add(Tac.Label(endLabel, resultVariable));
        }