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